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?