Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pobierz wszystkie rekordy rodziców/dzieci z bazy danych na Laravel (dane hierarchiczne)

Ponieważ wykonujesz operacje hierarchiczne, powinieneś użyć strategii zapisywania i pobierania tych danych z bazy danych.

Jednym z rozwiązań jest użycie Modelu zbioru zagnieżdżonego , co może to ułatwić. Laravel ma świetny pakiet, który się tym zajmuje, o nazwie etrepat/baum , to również wyjaśnia, jak to działa, cytuję:

Teoria, wersja TL;DR

Prostym sposobem na zobrazowanie działania zestawu zagnieżdżonego jest myślenie o encji rodzicielskiej otaczającej wszystkie dzieci i rodzica otaczającej ją, itd. Tak więc to drzewo:

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

Można to zwizualizować w następujący sposób:

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

Liczby reprezentują lewą i prawą granicę. Tabela może wtedy wyglądać tak:

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

Aby uzyskać wszystkie dzieci rodzica węzeł, ty

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

Aby uzyskać liczbę dzieci, należy

(right - left - 1)/2

Aby węzeł i wszyscy jego przodkowie wracali do korzenia, należy

SELECT * WHERE node.lft IS BETWEEN lft AND rgt

Jak widać, zapytania, które byłyby rekurencyjne i zaporowo wolne, zwykłe drzewa, nagle stają się dość szybkie. Fajnie, prawda?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę zaktualizować konkretny rekord bez uprawnień SELECT?

  2. Jak zmienić hasło do konta root MySQL w CentOS7?

  3. Nie można znaleźć klasy [org.springframework.orm.hibernate5.LocalSessionFactoryBean] dla ziarna o nazwie „hibernate5AnnotatedSessionFactory”

  4. Zagnieżdżone zapytanie wybierające MySQL?

  5. procedura składowana mysql:użycie zadeklarowanych zmiennych w instrukcji limit zwraca błąd