Data hierarkis agak mengganggu dalam database relasional (tidak termasuk Oracle, yang memiliki operator di START WITH/CONNECT BY
untuk menangani ini). Pada dasarnya ada dua model
:daftar adjacency dan kumpulan bersarang.
Anda telah memilih set ketetanggaan, yang biasanya saya lakukan juga. Ini jauh lebih mudah untuk diubah daripada model kumpulan bersarang, meskipun model kumpulan bersarang dapat diambil dalam urutan yang benar dalam satu kueri. Daftar kedekatan tidak boleh. Anda harus membangun struktur data perantara (pohon) dan kemudian mengubahnya menjadi daftar.
Apa yang akan saya lakukan (dan sebenarnya telah saya lakukan baru-baru ini) adalah:
- pilih seluruh isi menu dalam satu kueri yang diurutkan berdasarkan ID induk;
- Bangun pohon struktur menu menggunakan array asosiatif atau kelas/objek;
- Jalani pohon itu untuk membuat daftar tak berurutan bersarang; dan
- Gunakan plugin jQuery seperti Superfish untuk mengubah daftar itu menjadi menu.
Anda membuat sesuatu seperti ini:
$menu = array(
array(
'name' => 'Home',
'url' => '/home',
),
array(
'name' => 'Account',
'url' => '/account',
'children' => array(
'name' => 'Profile',
'url' => '/account/profile',
),
),
// etc
);
dan ubah menjadi ini:
<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 untuk menghasilkan larik menu dari cukup mudah tetapi agak rumit untuk dipecahkan. Anda menggunakan fungsi berjalan pohon rekursif yang membangun markup daftar bersarang HTML tetapi akan membiarkan implementasinya sebagai latihan untuk pembaca. :)