zapisovaci foreach pres pole objektu + rekurzivni pruchod
- koren
- Člen | 59
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 :)
- 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..
- 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 ?
- 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
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)