jak řešíte složitější SQL dotazy v Nette?
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- vitush93
- Člen | 33
Nette\Database je skvělý nástroj, ale nacházím ho místy omezující (nebo ho spíše neumím pořádně používat). Navíc s oblibou řeším nějakou logiku už v SQL – například boolean 0/1 informaci v databázi převádím podmínkou rovnou na zobrazovaný text.
Uvedu něco konkrétního. Anketu mám na jednom webu řešenou ve 3 tabulkách anketa (obsahuje text otázky a informaci, zda je anketa aktivní nebo archivovaná), anketa_otazky (odpovědi pro danou tabulku) a anketa_hlasy (hlasy pro danou odpověď). Celá legrace pak vypadá takto:
SELECT otazka, hlasy, ROUND((hlasy/total)*100) AS procenta
FROM (
SELECT anketa_otazky.text AS otazka, COUNT(anketa_hlasy.id) AS hlasy
FROM anketa_hlasy
LEFT JOIN anketa_otazky ON anketa_hlasy.id_otazka = anketa_otazky.id
LEFT JOIN anketa ON anketa_otazky.id_anketa = anketa.id
WHERE anketa.aktivni = 1
GROUP BY anketa_hlasy.id_otazka
) AS tbl1 CROSS JOIN (
SELECT COUNT(anketa_hlasy.id) AS total
FROM anketa_hlasy
LEFT JOIN anketa_otazky ON anketa_hlasy.id_otazka = anketa_otazky.id
LEFT JOIN anketa ON anketa_otazky.id_anketa = anketa.id
WHERE anketa.aktivni = 1
) AS tbl2
Dotaz pak vrací výsledky ankety v té nejsrozumitelnější formě: Odpověď – Počet hlasů – Procenta
Moje řešení takových dotazů v modelu vypadá asi takto:
..
return $this->db->query("mazec")->fetchAll();
..
Jak podobné situace řešíte vy? Nebo na vše používáte ORM?