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?