Stromový výpis – Nette/dibi – jak na to?
- maarlin
- Člen | 207
Ahoj,
mám menší problém.
Mám dvě tabulky – groups a users.
V tabulce groups jsou 2 sloupce – id a name.
V tabulce users je spousta sloupců – podrobnosti o userovi.
Rád bych udělal stromový výpis – vždy grupa a po ní patřiční
příslušející users – navázané přes users.group_id (groups.id).
Nenapadá mě, jak to udělat.
V mém původním „pseudo-praso-kódu“ bych to udělal tak, že bych
při vypsání každé grupy se dotázal databáze na všechny související
users. Ovšem to není zrovna oddělení šablony a programového kódu…
Navíc se mi ani moc nezdá cpát nějak tolik kódu do šablony (pokud to
vůbec jde).
Je asi potřeba nějak vytvořit k tomu stávajícímu poli, které vrací
$userGroups->findAll()
přidat pár „sloupců“, resp.
řekněme že aktuálně vrací toto:
$group->id (int), $group->name (string)
a já potřebuji, aby vracel navíc toto:
$group->users (array)
a mohl jsem k tomu třeba přistoupit pak v šabloně jako k poli…
{foreach $group->users as $user}
#{$user->id}: {$user->name} ({$user->age})<br />
{/foreach}
- Ondřej Mirtes
- Člen | 1536
Já bych udělal to, že bych vybral v jednom dotazu všechny uživatele, joinul k nim názvy skupin, ve kterých jsou a seřadil je podle skupiny, ve které se nacházejí. To ti zařídí vybrání všech potřebných dat na jeden dotaz.
Šablona by už byla složitější. Tam bys zahájil výpis uživatelů a vždy, pokud by se jim změnila skupina (byl by zahájen výpis uživatelů z další skupiny), vypsal bych nadpis dané struktury, či cokoli odsazeného zpět, co potřebuješ.
Třeba někdo přijde s jiným nápadem, který bude vyžadovat také pouze jeden dotaz na DB a odlehčí kódu v šabloně.
- lucass
- Člen | 89
Ke stromové struktuře přímo z Dibi:
Jak psal Ondřej Mirtes, spoj si ty dvě tabulky přes JOIN, popř. si vytvoř v DB rovnou pohled, a pak se zkus mrknout na toto: https://forum.dibiphp.com/…34-fetchtree
V PHP si pak dej do konstruktoru nějaké třídy s DB konekcí (nebo kamkoliv, co načítáš při každém requestu), toto:
<?php
public function __construct() {
...
// pridani metody pro fetch stromecku
DibiObject::extensionMethod('DibiObject::fetchTree', 'NazevTveTridy::fetchTree');
...
}
public static function fetchTree(DibiResult $obj, $id, $parent_id) {
// vlastni definice funkce z odkazu vyse
}
?>
Příklad použití:
<?php
$r = dibi::query("SELECT * FROM [core.v_sitemap]");
Debug::dump($r->fetchTree('id_sitemap','fk_id_sitemap'));
?>
K šabloně
Z toho dotazu dostaneš pole poskládané do struktur tak, jak potřebuješ, pospojované dle těch dvou klíčů, takže si udělej rekurzivní šablonku a vyprskni to tam.