Йерархичните данни са донякъде досадни в релационна база данни (с изключение на Oracle, която има оператори в START WITH/CONNECT BY
да се справят с това). По принцип има два модела
:списък на съседство и вложени набори.
Вие сте избрали набори за съседство, което обикновено правя и аз. Много по-лесно е да се промени от модела на вложен набор, въпреки че моделът на вложен набор може да бъде извлечен в правилния ред в една заявка. Списъците със съседство не могат да бъдат. Ще трябва да изградите междинна структура от данни (дърво) и след това да я преобразувате в списък.
Това, което бих направил (и всъщност го направих наскоро), е:
- изберете цялото съдържание на менюто в една заявка, подредена по ID на родител;
- Изградете дърво на структурата на менюто с помощта на асоциативни масиви или класове/обекти;
- Разходете се по това дърво, за да създадете вложени неподредени списъци; и
- Използвайте добавка jQuery като Superfish за да превърнете този списък в меню.
Изграждате нещо подобно:
$menu = array(
array(
'name' => 'Home',
'url' => '/home',
),
array(
'name' => 'Account',
'url' => '/account',
'children' => array(
'name' => 'Profile',
'url' => '/account/profile',
),
),
// etc
);
и го преобразувайте в това:
<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>
...
PHP за генериране на масива от менюта е сравнително лесен, но малко фин за решаване. Използвате рекурсивна функция за обхождане на дърво, която изгражда маркирането на вложен списък в HTML, но ще остави изпълнението си като упражнение за читателя. :)