Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Laravel (पदानुक्रमित डेटा) पर डेटाबेस से सभी माता-पिता/बाल रिकॉर्ड पुनर्प्राप्त करें

चूंकि आप पदानुक्रमित संचालन कर रहे हैं, इसलिए आपको इस डेटा को अपने डेटाबेस से सहेजने और पुनर्प्राप्त करने के लिए एक रणनीति का उपयोग करना चाहिए।

एक तरीका नेस्टेड सेट मॉडल का उपयोग करना है , जो इसे आसान बना सकता है। लारवेल के पास एक बेहतरीन पैकेज है जो इससे संबंधित है, जिसे etrepat/baum कहा जाता है। , यह भी बताता है कि यह कैसे काम करता है और मैं उद्धृत करता हूं:

इसके पीछे का सिद्धांत, एक TL;DR संस्करण

नेस्टेड सेट कैसे काम करता है, इसकी कल्पना करने का एक आसान तरीका यह है कि अपने सभी बच्चों के आस-पास की मूल इकाई और उसके आस-पास के माता-पिता आदि के बारे में सोचें। तो यह पेड़:

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

इस तरह देखा जा सकता है:

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

संख्याएँ बाएँ और दाएँ सीमाओं का प्रतिनिधित्व करती हैं। तब तालिका इस तरह दिख सकती है:

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

माता-पिता . के सभी बच्चों को प्राप्त करने के लिए नोड, आप

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

बच्चों की संख्या प्राप्त करने के लिए, यह है

(right - left - 1)/2

एक नोड और उसके सभी पूर्वजों को जड़ में वापस लाने के लिए, आप

SELECT * WHERE node.lft IS BETWEEN lft AND rgt

जैसा कि आप देख सकते हैं, सामान्य पेड़ों पर पुनरावर्ती और निषेधात्मक रूप से धीमी गति से चलने वाले प्रश्न अचानक काफी तेज होते हैं। निफ्टी, है ना?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. InnoDB बहुत धीमी और धीमी गति से सम्मिलित करता है

  2. DBD::mysql . का उपयोग करने में पर्ल त्रुटि के साथ मदद चाहिए

  3. Mysql Dump के साथ दृश्यों का बैकअप लेना

  4. MySQL प्रश्न - एकाधिक प्रकार के उपयोगकर्ताओं को कैसे संभालें - एक टेबल या एकाधिक?

  5. SQL अनेक से अनेक का चयन करें