sql >> データベース >  >> RDS >> Mysql

PHP/MySQL-ナビゲーションメニュー階層の構築

    階層型データは、リレーショナルデータベースではやや煩わしいものです(START WITH/CONNECT BYに演算子があるOracleを除く) これに対処するために)。基本的に2つのモデル があります :隣接リストと入れ子集合。

    あなたは隣接セットを選択しました。これは私も通常行うことです。入れ子集合モデルは単一のクエリで正しい順序で取得できますが、入れ子集合モデルよりも変更がはるかに簡単です。隣接リストはできません。中間データ構造(ツリー)を構築してから、それをリストに変換する必要があります。

    私がすること(そして実際に最近やったこと)は次のとおりです:

    • 親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ネストリストマークアップを構築する再帰的なツリーウォーキング関数を使用しますが、その実装は読者の演習として残します。 :)



    1. PostgreSQLを使用して1つのステートメントで複数の列の名前を変更する

    2. MySQLのバックアップと復元を行うための最速の方法

    3. 列内の重複するエントリを検索する

    4. EasysoftODBCドライバーとODBCINSTライブラリ