Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Alle über-/untergeordneten Datensätze aus der Datenbank auf Laravel abrufen (hierarchische Daten)

Da Sie hierarchische Operationen durchführen, sollten Sie eine Strategie zum Speichern und Abrufen dieser Daten aus Ihrer Datenbank verwenden.

Ein Ansatz ist die Verwendung von Nested Set Model , das kann es einfacher machen. Laravel hat ein großartiges Paket, das sich damit befasst, namens etrepat/baum , das erklärt auch, wie es funktioniert und ich zitiere:

Die Theorie dahinter, eine TL;DR-Version

Eine einfache Möglichkeit, sich vorzustellen, wie eine verschachtelte Menge funktioniert, besteht darin, sich eine übergeordnete Entität vorzustellen, die alle ihre Kinder umgibt, und ihre übergeordnete Entität, die sie umgibt usw. Also dieser Baum:

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

Könnte so visualisiert werden:

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

Die Zahlen repräsentieren die linken und rechten Grenzen. Die Tabelle könnte dann so aussehen:

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

Um alle Kinder eines Elternteils zu erhalten Knoten, Sie

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

Um die Anzahl der Kinder zu erhalten, ist es

(right - left - 1)/2

Um einen Knoten und alle seine Vorfahren zurück zur Wurzel zu bekommen, müssen Sie

SELECT * WHERE node.lft IS BETWEEN lft AND rgt

Wie Sie sehen können, sind Abfragen, die auf gewöhnlichen Bäumen rekursiv und unerschwinglich langsam wären, plötzlich ziemlich schnell. Raffiniert, nicht wahr?