階層型データは、リレーショナルデータベースではやや煩わしいものです(START WITH/CONNECT BY
に演算子があるOracleを除く) これに対処するために)。基本的に
あなたは隣接セットを選択しました。これは私も通常行うことです。入れ子集合モデルは単一のクエリで正しい順序で取得できますが、入れ子集合モデルよりも変更がはるかに簡単です。隣接リストはできません。中間データ構造(ツリー)を構築してから、それをリストに変換する必要があります。
私がすること(そして実際に最近やったこと)は次のとおりです:
- 親ID順に並べられた1つのクエリでメニューコンテンツ全体を選択します。
- 連想配列またはクラス/オブジェクトを使用してメニュー構造のツリーを構築します。
- そのツリーをたどって、ネストされた順序なしリストを作成します。および
- Superfish のようなjQueryプラグインを使用します そのリストをメニューに変換します。
次のようなものを作成します:
$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ネストリストマークアップを構築する再帰的なツリーウォーキング関数を使用しますが、その実装は読者の演習として残します。 :)