Dane hierarchiczne są nieco irytujące w relacyjnej bazie danych (z wyjątkiem Oracle, która ma operatory w START WITH/CONNECT BY
sobie z tym poradzić). Zasadniczo istnieją dwa modele
:lista sąsiedztwa i zestawy zagnieżdżone.
Wybrałeś zestawy sąsiedztwa, co ja też zwykle robię. Jest o wiele łatwiej zmienić niż zagnieżdżony model zestawu, chociaż zagnieżdżony model zestawu można pobrać we właściwej kolejności w jednym zapytaniu. Listy sąsiedztwa nie mogą być. Musisz zbudować pośrednią strukturę danych (drzewo), a następnie przekonwertować ją na listę.
To, co bym zrobił (i zrobiłem ostatnio) to:
- wybierz całą zawartość menu w jednym zapytaniu uporządkowanym według identyfikatora rodzica;
- Zbuduj drzewo struktury menu za pomocą tablic asocjacyjnych lub klas/obiektów;
- Przejdź po tym drzewie, aby utworzyć zagnieżdżone nieuporządkowane listy; i
- Użyj wtyczki jQuery, takiej jak Superfish by zmienić tę listę w menu.
Budujesz coś takiego:
$menu = array(
array(
'name' => 'Home',
'url' => '/home',
),
array(
'name' => 'Account',
'url' => '/account',
'children' => array(
'name' => 'Profile',
'url' => '/account/profile',
),
),
// etc
);
i przekształć to w to:
<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 do generowania tablicy menu jest dość proste, ale trochę trudne do rozwiązania. Używasz rekurencyjnej funkcji chodzenia po drzewie, która buduje znaczniki zagnieżdżonej listy HTML, ale pozostawia implementację jako ćwiczenie dla czytelnika. :)