sql >> Database teknologi >  >> RDS >> Mysql

Hent alle overordnede/underordnede poster fra databasen på Laravel (hierarkiske data)

Da du udfører hierarkiske operationer, bør du bruge en strategi til at gemme og hente disse data fra din database.

En tilgang er at bruge Nested Set Model , som kan gøre det nemmere.Laravel har en fantastisk pakke, der omhandler det, kaldet etrepat/baum , som også forklarer, hvordan det virker, og jeg citerer:

Teorien bag, en TL;DR-version

En nem måde at visualisere, hvordan et indlejret sæt fungerer på, er at tænke på en overordnet enhed, der omgiver alle sine børn, og dens forælder, der omgiver det osv. Så dette træ:

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

Kunne visualiseres sådan her:

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

Tallene repræsenterer venstre og højre grænser. Tabellen kan så se sådan ud:

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

For at få alle børn af en forælder node, dig

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

For at få antallet af børn, er det

(right - left - 1)/2
 

For at få en node og alle dens forfædre til at gå tilbage til roden, skal du

SELECT * WHERE node.lft IS BETWEEN lft AND rgt
 

Som du kan se, er forespørgsler, der ville være rekursive og uoverkommeligt langsomme på almindelige træer, pludselig ret hurtige. Pænt, ikke?




  1. MySQL automatisk caste/konvertere en streng til et tal?

  2. Erstat i forespørgselssyntaks

  3. Hvordan kontrollerer man, om der findes en lagret procedure?

  4. Hvordan kan jeg omdøbe kolonne i laravel ved hjælp af migration?