Jak zapsat EXISTS v Nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
dreken
Člen | 36
+
0
-

Zdravím,
Jak lze zapsat v Nette\Database něco jako tohle?
SELECT ... FROM tab WHERE EXISTS(SELECT ... FROM tab2 WHERE ...)

Zkoušel jsem to podle tohoto starého vlákna:
https://forum.nette.org/…tte-database
Ale nefunguje mi to, vypisuje to:
Column operator does not accept array argument

Díky za rady.

Editoval dreken (22. 9. 2014 23:13)

Azathoth
Člen | 495
+
0
-

Zkus to trochu jinak. Řekni nám, co potřebuješ z té databáze dostat a možná vymyslíme nějaký jiný způsob, jak dosáhnout toho samého.

dreken
Člen | 36
+
0
-

OK :-)
Mám v databázi:

  • Jednotlivé inzertní nabídky v tabulce offer
  • Parametry v tabulce parameter
  • Každá inzertní nabídka může mít přiřazených N typů parametrů, existuje tedy spojovací nabídka offer_parameter

Mám pohled, ve kterém potom potřebuji vypsat jednotlivé nabídky, které jsou uživatelsky filtrované. Například uživatel hledá vozy červené barvy s rokem výroby od 2000 do 2010 a se spotřebou do 8 l/100Km.

Editoval dreken (23. 9. 2014 10:22)

dreken
Člen | 36
+
0
-

V SQL to vypadá tak nějak:
SELECT offer.* FROM offer WHERE EXISTS(SELECT * FROM offer_parameter JOIN parameter ON offer_parameter.parameter_id = parameter.id WHERE offer_parameter.offer_id = offer.id AND parameter.idtxt='rok-vyroby' AND offer_parameter.num_value > 2000)

David Grudl
Nette Core | 8228
+
0
-

A $db->query('SELECT ... FROM tab WHERE EXISTS(SELECT ... FROM tab2 WHERE ?)', $conds) nestačí?

dreken
Člen | 36
+
+1
-

Díky Davide, když už to říkáš Ty, tak asi v Nette PDO pro tento typ dotazu moc možností není. :-)

Zatím jsem to vyřešil takhle:

$subquery = $db->table("offer_parameter")->where("offer_parameter.offer_id = offer.id")->where(...);
$query = $db->table("offer")->where("EXISTS(" . $subquery->getSql() . ")");

Jediný problém, že v $subquery se to nevyžádaně JOINuje s offer kvůli podmínce:

->where("offer_parameter.offer_id = offer.id")

čili pak tento JOIN musím celkem prasácky ze $subquery odstraňovat…

Editoval dreken (23. 9. 2014 15:09)