Jak v Nette\Database na kategorie

- Melmen
 - Člen | 132
 
Ahoj,
řeším jednu aplikaci, a za boha nevím jak mám vyřešit následující problém:
Mám tabulku os, kde je id (pk), name (tabulka je pro seznam
operačních systémů)
Tabulku categories, kde je id (pk), name, slug, os_id (fk do
tabulky os), categories_id(fk do categories – na rodiče).
A teď co potřebuju:
Mám menu, kde bude seznam všech os (Android, iOS…) Po kliknutí Třeba na Android by se měla rozbalit nabídka s podkategoriema. Nejdřív bych potřeboval vypsat Hlavní kategorii (tam kde je null), a pod ní všechny její potomky.
Může mě někdo (na)kopnout jak toho docílit? Nepotřebuju nekonečné zanořování kategorii, jen rozdělení podle OS, hlavní kategorie, a její sub-kategorie.
Nette používám 2.0.3, akorát Nette\Database jsem dneska sosnul z Githubu od @hrach :)
Díky za pomoc :-)

- hrach
 - Člen | 1844
 
jen tak z hlavy:
foreach ($db->table('os') as $os) {
	echo $os->name;
	foreach ($os->related('categories')->where('categories_id', null) as $category) {
		echo $category->name;
		foreach ($os->related('categories') as $subCategory) {
			echo $subCategory->name;
		}
	}
}
Pokud mas DiscroveredReflection, melo by to snad takto fungovat, jinak by
bylo treba upravit ConventionalReflection, aby vedel, jak mirit sam na sebe
v tomto radku
foreach ($os->related('categories') as $subCategory) {.

- Melmen
 - Člen | 132
 
@hrach Funguje perfektně, díky ! Jen jsem si musel dát podmínku ->where(‚categories_id != ?‘, null) do toho třetího foreache :-)
Pro ty co by řešily něco podobného, zde je kód v Latte:
<ul class="nav">
                    <li n:foreach="$oss as $os" class="dropdown">
                        <a href="#"
                           class="dropdown-toggle"
                           data-toggle="dropdown">
                            {$os->name}
                            <b class="caret"></b>
                        </a>
                        <ul class="dropdown-menu">
                            {foreach $os->related('categories')->where('categories_id', null) as $category}
                           <li> <span style="color: red;">{$category->name}:</span></li>
                              {foreach $os->related('categories')->where('categories_id != ?', "null") as $subCategory}
                            <li> <span style="color: green;">{$subCategory->name}:</span></li>
                            {/foreach}
                            {/foreach}
                        </ul>
                    </li>
                </ul>
$oss je v presenteru
$this->context->createOs()
Ještě jednou díky, moc mi to pomohlo!
//EDIT: Kecám,
->where('categories_id != ?', null) jsem musel přepsat na `->where('categories_id', $category->id) –
jinak jsem měl všude v menu stejný položky, teď už je to super :-)
Editoval Melmen (22. 7. 2012 17:32)