Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Ambil semua catatan induk/anak dari database di Laravel (data hierarkis)

Karena Anda melakukan operasi hierarkis, Anda harus menggunakan strategi untuk menyimpan dan mengambil data ini dari database Anda.

Salah satu pendekatannya adalah menggunakan Model Kumpulan Bersarang , yang dapat membuatnya lebih mudah. ​​Laravel memiliki paket hebat yang menanganinya, yang disebut etrepat/baum , itu juga menjelaskan cara kerjanya dan saya kutip:

Teori di baliknya, versi TL;DR

Cara mudah untuk memvisualisasikan cara kerja kumpulan bersarang adalah dengan memikirkan entitas induk yang mengelilingi semua anaknya, dan induknya yang mengelilinginya, dll. Jadi pohon ini:

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

Bisa divisualisasikan seperti ini:

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

Angka mewakili batas kiri dan kanan. Tabelnya mungkin terlihat seperti ini:

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

Untuk mendapatkan semua anak dari orang tua simpul, Anda

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

Untuk mendapatkan jumlah anak, ini

(right - left - 1)/2

Untuk mendapatkan simpul dan semua leluhurnya kembali ke akar, Anda

SELECT * WHERE node.lft IS BETWEEN lft AND rgt

Seperti yang Anda lihat, kueri yang akan menjadi rekursif dan sangat lambat pada pohon biasa tiba-tiba menjadi cukup cepat. Bagus, bukan?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hapus nol di belakang dalam nilai desimal dengan mengubah panjang

  2. Bagaimana cara mendapatkan daftar tanggal antara dua tanggal di kueri pemilihan mysql

  3. Jumlah kolom tidak cocok dengan jumlah nilai pada baris 1

  4. Bagaimana cara menghapus banyak baris dari database mysql dengan kotak centang menggunakan PHP?

  5. Panduan Merancang Database Untuk Sistem Pemesanan Restoran Di MySQL