sql >> Databasteknik >  >> RDS >> Mysql

Hämta alla överordnade/barnposter från databasen på Laravel (hierarkiska data)

Eftersom du utför hierarkiska operationer bör du använda en strategi för att spara och hämta dessa data från din databas.

En metod är att använda Nested Set Model , som kan göra det enklare.Laravel har ett bra paket som hanterar det, som heter etrepat/baum , som också förklarar hur det fungerar och jag citerar:

Teorin bakom, en TL;DR-version

Ett enkelt sätt att visualisera hur en kapslad uppsättning fungerar är att tänka på en överordnad enhet som omger alla sina barn, och dess förälder som omger den, etc. Så det här trädet:

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

Skulle kunna visualiseras så här:

 ___________________________________________________________________
|  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
|   |___________________________|   |___________________________|   |
|___________________________________________________________________|

Siffrorna representerar vänster och höger gränser. Tabellen kan då se ut så här:

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

För att få alla barn till en förälder nod, du

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

För att få antalet barn är det

(right - left - 1)/2

För att få en nod och alla dess förfäder att gå tillbaka till roten, du

SELECT * WHERE node.lft IS BETWEEN lft AND rgt

Som du kan se är frågor som skulle vara rekursiva och oöverkomligt långsamma på vanliga träd plötsligt ganska snabba. Snyggt, eller hur?




  1. MySQL subquery returnerar mer än en rad

  2. Förbättra SQL INSERT-frågan för att undvika sql-injektioner

  3. MySQL välj rader där left join är null

  4. Vilket är det största ID-numret som autoincrement kan producera i mysql