चूंकि आप पदानुक्रमित संचालन कर रहे हैं, इसलिए आपको इस डेटा को अपने डेटाबेस से सहेजने और पुनर्प्राप्त करने के लिए एक रणनीति का उपयोग करना चाहिए।
एक तरीका नेस्टेड सेट मॉडल का उपयोग करना है , जो इसे आसान बना सकता है। लारवेल के पास एक बेहतरीन पैकेज है जो इससे संबंधित है, जिसे 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
जैसा कि आप देख सकते हैं, सामान्य पेड़ों पर पुनरावर्ती और निषेधात्मक रूप से धीमी गति से चलने वाले प्रश्न अचानक काफी तेज होते हैं। निफ्टी, है ना?