sql >> Databáze >  >> RDS >> Mysql

Načíst všechny záznamy o rodičích/dětech z databáze na Laravelu (hierarchická data)

Protože provádíte hierarchické operace, měli byste použít strategii k ukládání a načítání těchto dat z vaší databáze.

Jedním z přístupů je použití modelu Nested Set , což to může usnadnit. Laravel má skvělý balíček, který se s tím vypořádá, nazvaný etrepat/baum , to také vysvětluje, jak to funguje, a cituji:

Teorie v pozadí, verze TL;DR

Snadný způsob, jak si představit, jak vnořená množina funguje, je představit si nadřazenou entitu obklopující všechny její potomky a jejího rodiče, který ji obklopuje atd. Takže tento strom:

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

Dalo by se to zobrazit takto:

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

Čísla představují levou a pravou hranici. Tabulka pak může vypadat takto:

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

Chcete-li získat všechny děti rodiče uzel, ty

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

Chcete-li získat počet dětí, je to

(right - left - 1)/2

Chcete-li, aby se uzel a všichni jeho předci vrátili ke kořenu, vy

SELECT * WHERE node.lft IS BETWEEN lft AND rgt

Jak vidíte, dotazy, které by byly rekurzivní a neúměrně pomalé běžné stromy, jsou najednou docela rychlé. Šikovné, že?




  1. Funkce ATAN2() v Oracle

  2. Jak INTERSECT funguje v PostgreSQL

  3. Jak používat klauzuli hromadného sběru s příkazem SELECT INTO v databázi Oracle

  4. Rozdíl mezi místními a globálními dočasnými tabulkami v SQL Server