Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PHP/MySQL - budowanie hierarchii menu nawigacyjnego

Dane hierarchiczne są nieco irytujące w relacyjnej bazie danych (z wyjątkiem Oracle, która ma operatory w START WITH/CONNECT BY sobie z tym poradzić). Zasadniczo istnieją dwa modele :lista sąsiedztwa i zestawy zagnieżdżone.

Wybrałeś zestawy sąsiedztwa, co ja też zwykle robię. Jest o wiele łatwiej zmienić niż zagnieżdżony model zestawu, chociaż zagnieżdżony model zestawu można pobrać we właściwej kolejności w jednym zapytaniu. Listy sąsiedztwa nie mogą być. Musisz zbudować pośrednią strukturę danych (drzewo), a następnie przekonwertować ją na listę.

To, co bym zrobił (i zrobiłem ostatnio) to:

  • wybierz całą zawartość menu w jednym zapytaniu uporządkowanym według identyfikatora rodzica;
  • Zbuduj drzewo struktury menu za pomocą tablic asocjacyjnych lub klas/obiektów;
  • Przejdź po tym drzewie, aby utworzyć zagnieżdżone nieuporządkowane listy; i
  • Użyj wtyczki jQuery, takiej jak Superfish by zmienić tę listę w menu.

Budujesz coś takiego:

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

i przekształć to w to:

<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 do generowania tablicy menu jest dość proste, ale trochę trudne do rozwiązania. Używasz rekurencyjnej funkcji chodzenia po drzewie, która buduje znaczniki zagnieżdżonej listy HTML, ale pozostawia implementację jako ćwiczenie dla czytelnika. :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. porównaj dwie wartości oddzielone przecinkami w mysql

  2. Jak napisać migrację, aby zmienić klucz podstawowy modelu za pomocą ManyToManyField

  3. Jak skonfigurować niestandardowy MySQL NHibernate Batcher?

  4. jak liczyć wartości poziome w bazie danych?

  5. wywoływanie zagnieżdżonej procedury składowanej z php