sql >> Database >  >> RDS >> Mysql

Haal alle bovenliggende/onderliggende records op uit de database op Laravel (hiërarchische gegevens)

Aangezien u hiërarchische bewerkingen uitvoert, moet u een strategie gebruiken om deze gegevens op te slaan en op te halen uit uw database.

Een benadering is het gebruik van Genest setmodel , dat kan het gemakkelijker maken.Laravel heeft een geweldig pakket dat ermee omgaat, genaamd etrepat/baum , dat verklaart ook hoe het werkt en ik citeer:

De theorie erachter, een TL;DR-versie

Een gemakkelijke manier om te visualiseren hoe een geneste set werkt, is te denken aan een bovenliggende entiteit die al zijn kinderen omringt, en de bovenliggende entiteit eromheen, enz. Dus deze boom:

root
  |_ Child 1
    |_ Child 1.1
    |_ Child 1.2
  |_ Child 2
    |_ Child 2.1
    |_ Child 2.2

Kan als volgt worden gevisualiseerd:

 ___________________________________________________________________
|  Root                                                             |
|    ____________________________    ____________________________   |
|   |  Child 1                  |   |  Child 2                  |   |
|   |   __________   _________  |   |   __________   _________  |   |
|   |  |  C 1.1  |  |  C 1.2 |  |   |  |  C 2.1  |  |  C 2.2 |  |   |
1   2  3_________4  5________6  7   8  9_________10 11_______12 13  14
|   |___________________________|   |___________________________|   |
|___________________________________________________________________|

De cijfers vertegenwoordigen de linker- en rechtergrenzen. De tabel kan er dan als volgt uitzien:

id | parent_id | lft  | rgt  | depth | data
 1 |           |    1 |   14 |     0 | root
 2 |         1 |    2 |    7 |     1 | Child 1
 3 |         2 |    3 |    4 |     2 | Child 1.1
 4 |         2 |    5 |    6 |     2 | Child 1.2
 5 |         1 |    8 |   13 |     1 | Child 2
 6 |         5 |    9 |   10 |     2 | Child 2.1
 7 |         5 |   11 |   12 |     2 | Child 2.2

Om alle kinderen van een ouder te krijgen knooppunt, jij

SELECT * WHERE lft IS BETWEEN parent.lft AND parent.rgt

Om het aantal kinderen te krijgen, is het

(right - left - 1)/2

Om een ​​knoop en al zijn voorouders terug te laten gaan naar de wortel, moet je

SELECT * WHERE node.lft IS BETWEEN lft AND rgt

Zoals je kunt zien, zijn zoekopdrachten die recursief en onbetaalbaar traag zouden zijn op gewone bomen plotseling behoorlijk snel. Handig, nietwaar?




  1. MySQL-deelnametabellen groeperen op somprobleem

  2. SQlite Query in Android met cursor

  3. Verschillen in weken tussen PHP en MySQL

  4. group_concat MYSQL nieuwe regel