Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP/MySQL - Aufbau einer Navigationsmenühierarchie

Hierarchische Daten sind in einer relationalen Datenbank etwas lästig (mit Ausnahme von Oracle, das Operatoren in START WITH/CONNECT BY hat damit umzugehen). Grundsätzlich gibt es zwei Modelle :Nachbarschaftsliste und verschachtelte Mengen.

Sie haben Adjazenzsätze ausgewählt, was ich normalerweise auch mache. Es ist viel einfacher zu ändern als das verschachtelte Mengenmodell, obwohl das verschachtelte Mengenmodell in einer einzigen Abfrage in der richtigen Reihenfolge abgerufen werden kann. Nachbarschaftslisten können nicht sein. Sie müssen eine Zwischendatenstruktur (Baum) erstellen und diese dann in eine Liste umwandeln.

Was ich tun würde (und tatsächlich kürzlich getan habe) ist:

  • Wählen Sie den gesamten Menüinhalt in einer Abfrage sortiert nach Eltern-ID aus;
  • Erstellen Sie einen Baum der Menüstruktur mit assoziativen Arrays oder Klassen/Objekten;
  • Wandern Sie durch diesen Baum, um verschachtelte ungeordnete Listen zu erstellen; und
  • Verwenden Sie ein jQuery-Plug-in wie Superfish um diese Liste in ein Menü umzuwandeln.

Sie bauen so etwas:

$menu = array(
  array(
    'name' => 'Home',
    'url' => '/home',
  ),
  array(
    'name' => 'Account',
    'url' => '/account',
    'children' => array(
      'name' => 'Profile',
      'url' => '/account/profile',
    ),
  ),
  // etc
);

und konvertieren Sie es in dieses:

<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>
...

Das PHP zum Generieren des Menü-Arrays ist ziemlich einfach, aber etwas schwierig zu lösen. Sie verwenden eine rekursive Tree-Walking-Funktion, die das verschachtelte HTML-Listen-Markup erstellt, ihre Implementierung jedoch als Übung für den Leser belässt. :)