Database: join přes dvě úrovně, podmínky s OR
- petr.pavel
- Člen | 535
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
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.