Zápis složitějších dotazů na Nette\Database – použití query
- raketoplan2005
- Člen | 147
Ahoj,
snažím se přepsat své DB dotazy do Nette\Database, podle článku jednoho z místních programátorů jsem před časem uložil menu v closure table. Když jsem ale přidal navíc řazení, je pak výběr prvků „poměrně složitý“ dotaz.
SELECT c2.*, cc2.ancestor AS `_parent`,
GROUP_CONCAT(breadcrumb.ancestor ORDER BY breadcrumb.depth DESC) AS breadcrumbs
FROM category AS c1
JOIN category_closure AS cc1 ON (cc1.ancestor = c1.id)
JOIN category AS c2 ON (cc1.descendant = c2.id)
LEFT OUTER JOIN category_closure AS cc2 ON (cc2.descendant = c2.id AND cc2.depth = 1)
JOIN category_closure AS breadcrumb ON (cc1.descendant = breadcrumb.descendant)
WHERE c1.id = 1 AND c1.active = 1
GROUP BY cc1.descendant
ORDER BY breadcrumbs;
Nedokážu asi ty joiny zrealizovat, myslíte, že se mám pokoušet o jeho přepsání, nebo je výhodnější použít
connection->query
Zatím to vzhledem k tomu, že tak složitý zápis jsem v Nette\Database nedokázal napsat, totiž nechávám v té druhé variantě.
- raketoplan2005
- Člen | 147
@hrach: Děkuji.
@enumag: To teď řeším, a snad i vyřeším, třetí tabulkou s pořadím v rámci prvků na stejné úrovni.
- enumag
- Člen | 2118
@raketoplan2005: Jestli se ti to podaří tak aby fungoval výběr celého podstromu jedním dotazem s tím, že každá vrstva bude příslušně seřazená (ale samozřejmě přerušovaná podstromy) tak klobouk dolů. ;-) V takovém případě bych se velmi rád podíval na kód, jsi-li ochoten se podělit.
- raketoplan2005
- Člen | 147
@enumag:
Řešení mi pomohl nalézt Bill Karwin a vypadá nějak takto:
SELECT c2. * , GROUP_CONCAT( o.sibling_order
ORDER BY breadcrumb.depth DESC ) AS breadcrumbs
FROM category AS c1
JOIN category_closure AS cc1 ON ( cc1.ancestor = c1.id )
JOIN category AS c2 ON ( cc1.descendant = c2.id )
LEFT OUTER JOIN category_closure AS cc2 ON ( cc2.descendant = c2.id AND cc2.depth =1 )
JOIN category_closure AS breadcrumb ON ( cc1.descendant = breadcrumb.descendant )
JOIN category_closure_order AS o ON breadcrumb.ancestor = o.ancestor
WHERE c1.id = 1 /* ROOT */ AND c1.active = 1
GROUP BY cc1.descendant
ORDER BY breadcrumbs
S tím že tabulka category_closure_order má dva sloupce – v prvním jsou id všech položek menu a ve druhém je pozice mezi položkami stejné úrovně (zerofill). Řazení pak probíhá podle agregovaného sloupce breadcrumbs.
Editoval raketoplan2005 (2. 1. 2013 0:29)
- marten
- Člen | 2
Pokud vam jde pouze o vypsani stromu kategorii nebo cehokoliv, zkuste to ukladat trochu lepe nez jen se sloupeckem parent_id (nebo neco podobneho). Jedna z moznosti je pouziti tree traversal. Pred par lety jsem psal kratky clanek jak to dostat do DB a mala ukazka jak dostat cely strom http://www.marten-online.com/…ructure.html