tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

DibiFluent a ->whereExists

před 10 lety

blacksun
Člen | 181

Zdravím,

narazil jsem na problém, kdy se při použití ->where a ->whereExists ve vygenerovaném dotazu nepřidává před whereExists „spojka“ AND. Pokud za ->whereExists použije další ->where, nepřidává se už pak také.

Trochu kódu:

<?php
if($form['use_statute']) {
  $select->where('[st].[id]')->in($form['statute_select']);
}

if($form['use_price']) {
  $select->where('[r].[end_price]'.$form['price_greater']."'".$form['price_value']."'")
  ->and('[r].[currency]='."'".$form['price_currency']."'");
}

if($form['use_date_created']) {
  $select->where('[r].[created]'.$form['date_created_greater']."'".$form['date_created_value']."'");
}

if($form['use_product']) {
  $select->whereExists(dibi::select("1")->from('[delivery_contents]')->where('[product_id]')->in($form['product_select'])->where('[reference_id]=[r].[id]'));
?>

generuje

<?php
`SELECT `r`.`id`, `r`.`label`, `r`.`date_delivery_month`, `r`.`date_delivery_year`, `r`.`end_price`, `r`.`currency`, `r`.`customer_name_en`, `ci`.`name_en` as `city_name`, `co`.`name_en` as `country_name`, `p`.`name` as `partner_name`, `st`.`name_en` as `statue_name`, date_format(`r`.`created`,'%Y/%m/%d') as `created` FROM `reference` `r` JOIN `city` `ci` ON `r`.`city_id`=`ci`.`id` JOIN `statute` `st` ON `r`.`statute_id`=`st`.`id` JOIN `country` `co` ON `ci`.`country_id`=`co`.`id` LEFT OUTER JOIN `partner` `p` ON `r`.`partner_id`=`p`.`id` WHERE `st`.`id` IN ('2') AND `r`.`end_price`<'70' AND `r`.`currency`='EUR' AND `r`.`created`<'2009-04-09' WHERE EXISTS ( SELECT 1 FROM `delivery_contents` WHERE `product_id` IN ('5', '10') AND `reference_id`=`r`.`id` ) AND concat(`r`.`date_delivery_year`,'-',`r`.`date_delivery_month`)<'2009-04' ORDER BY `ci`.`name_en`
?>

Případně li-je nějaká rada, jak toto upravit.

Edit: Ani před samotné ->exists se AND nepřidá.

Díky všem :)

Editoval blacksun (17. 4. 2009 12:01)

před 10 lety

David Grudl
Nette Core | 6806

Jako klauzuje musí být samotné where, takže něco jako ->where()->exists() nebo tak něco.

před 10 lety

blacksun
Člen | 181

Super, děkuji, funguje.