Nette\Database, ref() a order

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

Zdravim,
mam ve starsim projektu, ktery je postaven nad Nette\DB a zaroven nema uplne spravne pojmenovane vsechny sloupce tabulky pro reflekci, problem.

Mam tabulku ‚orderhasitem‘ (id, order_id, item_id), ze ktere selektim vsechny polozky podle ‚order_id‘.
Mam tabulku ‚item‘ (id, category_id, name)
Mam tabulku (sic!) ‚categories‘ (id, parent_id, name)

Potreboval bych selektit z ‚orderhasitem‘ vsechny polozky podle ‚order_id‘ tak, aby byly serazeny joinem na categories category_id->parent_id->name, tj. abecedne podle predka kategorie, ve ktere se item nachazi.

Celou konstrukci mam nyni resenu v latte jako

{foreach $order->related('orderhasitem') as $inorder}

a doufal jsem, ze pujde podobne vyresit i razeni, neco jako

{foreach $order->related('orderhasitem')->ref('categories','orderhasitem.item.category_id')->ref('categories','orderhasitem.item.categories.parent_id')>order('orderhasitem.item.categories.categories.name') as $inorder}

ale zjevne jsem uplne mimo a ref() se tady vubec pouzit neda.

Poradi prosim nekdo?

hrach
Člen | 1838
+
0
-

neco jako

{foreach $order->related('orderhasitem')->order('item.category.name') as $inorder}
elden46
Člen | 37
+
0
-

Taky je navic ten problem, ze join na na ketogorie je veden spatne syntakticky pojmenovanou tabulkou a klicem (tabulka categories, klic v item je category_id) a navic potrebuji radit ne podle kategorie, ale podle nadrazene kategorie (join categories na categories pres parent_id).

hrach napsal(a):

neco jako

{foreach $order->related('orderhasitem')->order('item.category.name') as $inorder}
hrach
Člen | 1838
+
0
-

neco jako

{foreach $order->related('orderhasitem')->order('item.category.parent.name') as $inorder}
elden46
Člen | 37
+
0
-

hrach napsal(a):

neco jako

{foreach $order->related('orderhasitem')->order('item.category.parent.name') as $inorder}

Bohuzel nejde.

Takto bych to mohl pouzit, kdyby se joinovana tabulka jmenovala category a klic z item by byl category_id. Ale i tak Nette/DB nepozna, jak najoinovat dalsi tabulku kategorii pres klic parent_id sama na sebe.

Navic, jak jsem psal, tabulky nejsou pojmenovane spravne, takze item.category_id je cizim klicem do categories

Nad GroupedSelection nejak nedokazu vynutit, jak se ma vsechno projoinovat (nejaka obdoba ref()). Takze jsem ztracen :-(

vvoody
Člen | 910
+
0
-

Zapni DiscoveredReflecion, tam na názve tabuľky nezáleží. Prosím rozpíš „Bohužel nejede“, aká exception?

elden46
Člen | 37
+
0
-

Bohuzel nejede = nedokazal najit spravnou tabulku pro join.

Ano, DiscoveredReflection by to snad vyresily, projekt je ale podedeny po nekom cizim a klice nejsou nikde nadefinovany, takze by je to chtelo dopsat a vubec zjistit, jeslti to pouzite mysql zvladne…

Vyresil jsem problem (velmi neelegantne) tak, ze si $inorder sestavuji jiz v prezenteru pomoci database->query() a do ni si dotaz napisu v cistem sql. Spatne, ale funkce:-(

vvoody
Člen | 910
+
0
-

Je nejaký problém prepnúť na DiscoveredReflection? Aká reflection tam je nastavená teraz? Conventional, alebo nejaká vlastná?

edit: to som vydedukoval že problém je s joinom tabuľky, podstatné je ale z ktorej do ktorej je problém, v exception to je napísané.

Editoval vvoody (13. 8. 2013 16:46)

duke
Člen | 650
+
0
-

Najít správnou tabulku pro join je úkolem třídy implementující rozhraní Database\IReflection. Pokud ti nestačí DiscoveredReflection či ConventionalReflection, napiš si vlastní (např. jako rozšíření ConventionalReflection).