Best Practice – Procházení rodičů

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

Uveďme si modelový příklad.

Mějme tabulky: Users, Texts, Posts, Views.
Users jsou rodičem pro texts. Texts jsou rodičem pro posts. Posts jsou rodičem pro views.

Vytáhnu si přes group+limit dotaz nad View několik záznamů. Chci si zobrazit jméno Postu, jméno Textu a jméno Usera. Tedy všech rodičů.

Při přímém přístupu to znamená přes cyklus projít výsledek dotazu a v řetězu se třikrát dotázat na rodiče. Při použití metody ref mi tento přístup v půli řetězu selže, protože nevrátí kompletní záznam, který neobsahuje odkaz na rodiče. V současnosti to mám implementováno přes prosté find dotazy s fetch metodou v návazposti v posloupnosti za sebou.

Otázka zní, jestli existuje nějaká best practice v případě procházení posloupnosti rodičů, když chci data od každého z nich a očekávám velkou pravděpodobnost opakování ve vyšších patrech pyramidy rodičovství.

jtousek
Člen | 951
+
0
-

Pokud jde o vazby 1:N, nevidím důvod, proč by ref mělo selhat. Kvůli optimalizacím, které NDB provádí jsou právě metody ref a related best practice.

Víš proč ref nefunguje? Pokud by podle tebe mělo fungovat, postni sem schémata tabulek a klikatelnou laděnku s chybou.

valman
Člen | 2
+
0
-

S Nette bojuji teprve tři dny a patrně šlo o problém s cache, protože její opětovné smazání pomohlo.
Problém byl v tom, že první ref vracelo pouze sloupce id a name a už ne text_id.

Současný kód vypadá následovně:

$chapters = $payments->select('chapter_id, count(*) AS cnt')->group('chapter_id')->order('cnt DESC')->limit(10);
foreach ($chapters as $chapter) {
    $info_chapter = $chapter->ref('chapter');
    $info_text = $info_chapter->ref('text');
    $info_author = $info_text->ref('user');
    /* Magic */
}

Měl bych však dotaz, jestli tento kód není náchylný k obdobným náhodným chybám do budoucna.

jtousek
Člen | 951
+
0
-

Ano i ne. V Nette\Database se podobné chyby sem tam vyskytují, alespoň dle mých zkušeností. Nedávno mi např. po aktualizaci Nette začala blbnout metoda related. Jde ovšem o chybu která je jen v dev verzi, stable Nette 2.0.3 je ok.

Editoval jtousek (7. 7. 2012 15:32)

hrach
Člen | 1834
+
0
-

Problemy ktere popisujes sou predevsim diky invalidaci cache. Pokud ji pri nasazeni smazes, nemeli by se vyskytovat. Problem jtousek budu teprve analyzovat, kazdopadne pripravovany master je uz hodne lidmi otestovan a mel by byt vysoce efektivni a stabilni.