Hiërarchische gegevens zijn enigszins vervelend in een relationele database (met uitzondering van Oracle, dat operators heeft in START WITH/CONNECT BY
hiermee om te gaan). Er zijn in principe twee modellen
:aangrenzende lijst en geneste sets.
Je hebt gekozen voor aangrenzende sets, wat ik meestal ook doe. Het is veel gemakkelijker te wijzigen dan het model van de geneste set, hoewel het model van de geneste set in een enkele query in de juiste volgorde kan worden opgehaald. Aangrenzende lijsten kunnen dat niet zijn. U moet een tussenliggende gegevensstructuur (boom) bouwen en die vervolgens omzetten in een lijst.
Wat ik zou doen (en in feite onlangs heb gedaan) is:
- selecteer de volledige menu-inhoud in één zoekopdracht, geordend op ouder-ID;
- Bouw een boomstructuur van de menustructuur met behulp van associatieve arrays of klassen/objecten;
- Loop door die boom om geneste ongeordende lijsten te maken; en
- Gebruik een jQuery-plug-in zoals Superfish om van die lijst een menu te maken.
Je bouwt zoiets als dit:
$menu = array(
array(
'name' => 'Home',
'url' => '/home',
),
array(
'name' => 'Account',
'url' => '/account',
'children' => array(
'name' => 'Profile',
'url' => '/account/profile',
),
),
// etc
);
en converteer het naar dit:
<ul class="menu">;
<li><a href="/">Home</a></li>
<li><a href="/account">Account Services</a>
<ul>
<li><a href="/account/profile">Profile</a></li>
...
De PHP voor het genereren van de menu-array is redelijk eenvoudig, maar een beetje lastig om op te lossen. U gebruikt een recursieve boom-wandelfunctie die de HTML-opmaak voor geneste lijsten opbouwt, maar de implementatie ervan overlaat als een oefening voor de lezer. :)