Database: join přes dvě úrovně, podmínky s OR

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

Ahoj, můžete mi, prosím, poradit, jestli je toto v Database možné a jak?

Mám tabulku projektů, úkolů, dodavatelů a zákazníků. Projekt má jednoho zákazníka, víc úkolů, každý úkol jednoho dodavatele. Potřebuji dotazem do úkolů získat ty, jejichž dodavatel nebo zákazník (přes projekt) má nějaké jméno. Výsledný dotaz:

SELECT *
FROM ukol
JOIN projekt ON (ukol.projekt_id = projekt.id)
JOIN zakaznik ON (projekt.zakaznik_id = zakaznik.id)
JOIN dodavatel ON (ukol.dodavatel_id = dodavatel.id)
WHERE (zakaznik.jmeno LIKE '%hledam%') OR (dodavatel.jmeno LIKE '%hledam%')

Vím, že to můžu vyřešit položením přesně tohoto dotazu přes PDO, ale rád bych to udělal nějakým košer způsobem přes Database. Kámen úrazu je v tom, že mám OR mezi kritérii a že zákazníci se spojují přes projekty (tj. přes dvě úrovně), ne rovnou na úkoly.

Zkoušel jsem všechno možné, i sestavit dotaz do zákazníků zvlášť:

$zakaznici = $db->table('zakaznik')->where('jmeno LIKE ?', '%hledam%');
$ukoly = $db->table('ukol')->where(
  '(dodavatel.jmeno LIKE ?) OR (projekt.zakaznik_id IN ?)', array('%hledam%', $zakaznici)
);

Ale Database nepochopí, že má ze $zakaznici udělat poddotaz.

Napadá vás něco?

petr.pavel
Člen | 535
+
0
-

Vyřešil jsem to tímhle patchem. Teď už Database rozpozná poddotaz. Pořád mám ale dojem, že by mohl existovat nějaký lepší způsob, jak docílit toho, co potřebuji.