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

Recupera tutti i record padre/figlio dal database su Laravel (dati gerarchici)

Poiché stai eseguendo operazioni gerarchiche, dovresti utilizzare una strategia per salvare e recuperare questi dati dal tuo database.

Un approccio consiste nell'usare Modello di set nidificato , che può renderlo più semplice.Laravel ha un ottimo pacchetto che si occupa di questo, chiamato etrepat/baum , che spiega anche come funziona e cito:

La teoria dietro, una versione TL;DR

Un modo semplice per visualizzare come funziona un insieme nidificato è pensare a un'entità genitore che circonda tutti i suoi figli, e il suo genitore che lo circonda, ecc. Quindi questo albero:

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

Potrebbe essere visualizzato in questo modo:

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

I numeri rappresentano i confini sinistro e destro. La tabella potrebbe quindi essere simile a questa:

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

Per avere tutti i figli di un genitore nodo, tu

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

Per ottenere il numero di bambini, è

(right - left - 1)/2

Per riportare un nodo e tutti i suoi antenati alla radice, devi

SELECT * WHERE node.lft IS BETWEEN lft AND rgt

Come puoi vedere, le query che sarebbero ricorsive e proibitivamente lente su alberi ordinari sono improvvisamente piuttosto veloci. Bello, vero?