Stromový výpis – Nette/dibi – jak na to?

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

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
+
0
-

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ě.

deric
Člen | 93
+
0
-

zkus se podívat na přiklady dibi a fetchAssoc

$res->fetchAssoc('group_id, user_id')
lucass
Člen | 89
+
0
-

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.