sql >> Database teknologi >  >> RDS >> Mysql

PHP/MySQL - opbygning af et nav-menuhierarki

Hierarkiske data er noget irriterende i en relationsdatabase (undtagen Oracle, som har operatorer i START WITH/CONNECT BY at håndtere dette). Der er grundlæggende to modeller :tilstødende liste og indlejrede sæt.

Du har valgt adjacency-sæt, hvilket jeg også typisk gør. Det er langt nemmere at ændre end den indlejrede sæt-model, selvom den indlejrede sæt-model kan hentes i den rigtige rækkefølge i en enkelt forespørgsel. Tilgrænsende lister kan ikke være. Du skal bygge en mellemliggende datastruktur (træ) og derefter konvertere den til en liste.

Hvad jeg ville gøre (og faktisk har gjort for nylig) er:

  • vælg hele menuindholdet i én forespørgsel sorteret efter forældre-id;
  • Byg et træ af menustrukturen ved hjælp af associative arrays eller klasser/objekter;
  • Gå gennem træet for at oprette indlejrede uordnede lister; og
  • Brug et jQuery-plugin som Superfish for at gøre listen til en menu.

Du bygger noget som dette:

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

og konverter det til dette:

<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 til at generere menuarrayet ud fra er rimeligt ligetil, men en smule finnicky at løse. Du bruger en rekursiv trævandringsfunktion, der opbygger HTML-indlejret listemarkering, men vil lade dens implementering være en øvelse for læseren. :)



  1. Sådan finder du ud af størrelsen på indekser i mysql (inklusive primære nøgler)

  2. Dvale forholdskortlægning/Gennemfør batchindsættelser

  3. Hvad er Option=N i MySQL ODBC-forbindelsesstrengen?

  4. Langsomme Postgres 9.3-forespørgsler