Zápis složitějších dotazů na Nette\Database – použití query

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

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ě.

hrach
Člen | 1838
+
0
-

Pouzij standardni query.

enumag
Člen | 2118
+
0
-

Osobně jsem proti closure table, protože nemohu definovat pořadí prvků v rámci vrstvy.

raketoplan2005
Člen | 147
+
0
-

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

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

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

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