zapisovaci foreach pres pole objektu + rekurzivni pruchod

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

Ahoj. Jsem novacek jak v Nette tak v OOP :) Uspesne jsem rozchodil Quickstart a ted se snazim o jeho rozsireni tak, aby se k jednotlivym Todo zaznamum daly vytvaret potomci stejne tridy (neco jako diskuzni forum s moznosti odpovedi)… V db to mam resene klasicky pomoci atributu parent, kdy v pripade nuly se jedna o rodicovske prvky, jinak o potomky…

Co ale nevim je, jak tahle data vhodne vytahnout ven.. Nejlepsi mi prislo kazdemu Todo objektu prirazovat pole jeho potomku a to tak, aby se stale jednalo o pole objektu Todo, resp. o objekt DibiResult… Nyni k tomu co nevim :)

  1. Podle skriptu nize prochazim pres rodicovske prvky a prirazuji potomky pomoci metody setDescendants, jenze je mi jasne, ze toto prirazeni se udrzi pouze v ramci foreach cyklu a dale uz ne.. chtelo by to nejaky zpusob reference podobne jako by se to u poli dalo resit prefixem & … To se mi zde ale nedari..
  2. Nevim zda mam data takto sestavovat v modelu nebo v prezenteru a zda je vubec tento postup vyhodny… Protoze tak zbytecne budu for-cyklovat data pri jejich vytahovani z databaze a pak znovu ve view (tusim ale ze v MVP je to tak bezne..) .. Nebo by se cela tato problematika dala resit nejak elegantneji ?
  3. jakym zpusobem by se toto cele dalo jednoduse rozsirit na vetveni i do dalsich podurovni ?
<?php
    public function findAllTodos() {
        $resultTodos = dibi::query('SELECT * FROM [todo] WHERE [parent]=%i',0)->setRowClass('Todo');

        foreach ($resultTodos->getIterator() as $id => $rowTodo) {
            $resultTodoReplies = dibi::query('SELECT * FROM [todo] WHERE [parent]=%i',$rowTodo['id'])->setRowClass('Todo');
            $rowTodo->setDescendants($resultTodoReplies);
        }
        return $resultTodos;
    }
?>
odin
Člen | 50
+
0
-

Rozhodne bych hlasoval pro to, aby to resila databaze, nastrel (pokud to ma byt jen dvourovnove):

<?php
$res = dibi::query("SELECT todo.id,todo.a,todo.b,todo.c,child.id AS c_id, child.a AS c_a,...
	FROM todo JOIN todo AS child ON todo.id=child.parent
	WHERE todo.parent IS NULL");
return $res->fetchAssoc('id,#');
?>

Misto parent = 0 doporucuji vymazat hodnty a pouzivat parent IS NULL, pak taky pujde nadefinovat si v DB cizi klic, a bude to vypadat jako databaze.

Editoval odin (7. 7. 2010 21:02)

koren
Člen | 56
+
0
-

dikes. pro moji nynejsi potrebu to takhle stacit bude, ale pokud bych chtel u Todo vic odpovedi, tak uz by to chtelo vymyslet jinak… bylo by to tedy mozny nejak resit tim foreach-cyklem ?