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
+
0
-

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?

enumag
Člen | 2118
+
0
-

Připadá mi, že to takhle bude dost neefektivní, rozložil bych to na několik dotazů (bez jejich vnořování). Taková je ostatně i filozofie NDB – každý dotaz by měl tahat data z právě jedné tabulky.

Editoval enumag (27. 8. 2013 10:13)