2014-09-23 9 views
14

मैंने वास्तव में with() विधि और load() विधि के बीच अंतर को समझने की कोशिश की, लेकिन वास्तव में समझ में नहीं आया।लार्वेल() विधि बनाम लोड() विधि

जैसा कि मैंने इसे देखा है, with() विधि का उपयोग करके "बेहतर" है क्योंकि मैं संबंध लोड करना चाहता हूं। ऐसा लगता है कि अगर मैं load() का उपयोग करता हूं तो मैं संबंध लोड करता हूं जैसे कि मैं hasMany() (या ऑब्जेक्ट्स के बीच संबंध से संबंधित किसी भी अन्य विधि) का उपयोग करता हूं।

क्या मुझे यह गलत लगता है?

उत्तर

32

दोनों एक ही अंतिम परिणाम को पूरा करते हैं- पहले से संबंधित मॉडल को लोड करना उत्सुक हैं। वास्तव में, वे दोनों एक ही दो प्रश्नों को चलाते हैं। मुख्य अंतर यह है कि with() प्रारंभिक क्वेरी (all(), first(), या find(x), उदाहरण के लिए) के तुरंत बाद संबंधित मॉडल को सामने से लोड करता है; load() का उपयोग करते समय, आप पहले प्रारंभिक क्वेरी चलाते हैं, और उसके बाद कुछ बाद के बिंदु पर संबंध लोड करते हैं।

"उत्सुक" यहाँ मतलब है कि हम एक विशिष्ट परिणाम के लिए सभी संबंधित मॉडल संबद्ध करते हैं सिर्फ एक क्वेरी, रूप n क्वेरी चला करना पड़ता था, जहां n आइटम्स की संख्या है का उपयोग कर सेट प्रारंभिक सेट में।


उत्सुक लोड हो रहा है हम उत्सुक लोड with() का उपयोग कर रहे हैं, तो उदाहरण के लिए with()

का उपयोग कर:

$users = User::with('comments')->get(); 

... अगर हम 5 उपयोगकर्ताओं है, निम्नलिखित दो प्रश्नों तुरंत चलाने मिल :

select * from `users` 
select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5) 

... और हम मॉडल के संग्रह के साथ समाप्त होते हैं जिसमें उपयोगकर्ता मॉडल से जुड़ी टिप्पणियां होती हैं, इसलिए हम $users->comments->first()->body जैसे कुछ कर सकते हैं।


"लेज़ी" उत्सुक लोड हो रहा है का उपयोग कर load()

या, हम दो प्रश्नों अलग कर सकते हैं, पहले प्रारंभिक परिणाम हो रही द्वारा:

$users = User::all(); 

जो चलाता है:

select * from `users` 

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

$users = $users->load('comments'); 

जो 2 क्वेरी चलाता है:

select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5) 

... और हम एक ही परिणाम के साथ खत्म , बस दो चरणों में विभाजित। फिर, हम किसी भी आइटम के लिए संबंधित मॉडल प्राप्त करने के लिए $users->comments->first()->body पर कॉल कर सकते हैं।


क्यों load() बनाम with() का उपयोग करें? load() आपको कुछ गतिशील स्थिति के आधार पर बाद में निर्णय लेने का विकल्प देता है, चाहे आपको दूसरी क्वेरी चलाने की आवश्यकता हो या नहीं। यदि, हालांकि, कोई सवाल नहीं है कि आपको सभी संबंधित वस्तुओं तक पहुंचने की आवश्यकता होगी, with() का उपयोग करें। इनमें से किसी


विकल्प; (वास्तव में, मेरा मानना ​​है कि load() के परिणामों संचित करने योग्य नहीं हैं डॉक्स भी लोड() का उपयोग करने के लिए एक कैशिंग लाभ संदर्भ है, लेकिन मुझे लगता है कि से परिचित नहीं हूँ।) प्रारंभिक परिणाम सेट के माध्यम से लूपिंग होगा और प्रत्येक आइटम के लिए hasMany() संबंध पूछताछ करेगा। यह इस उदाहरण में एन + 1 क्वेरी, या चलाना समाप्त हो जाएगा। उत्सुक लोड हो रहा है, यह सामने with() साथ या बाद में load() साथ किया है, चाहे, केवल प्रश्नों चलाता है।

+0

धन्यवाद! मेरे पास अभी भी एक सवाल है, मैं कभी भी उत्सुक लोडिंग का उपयोग क्यों नहीं करूंगा और सामान्य 'हैनी()' विधि का उपयोग क्यों करूं? (मुझे लगता है कि मेरे उत्तर का समाधान यह है कि जब भी मैं केवल एक उपयोगकर्ता से बात कर रहा हूं, इससे कोई फर्क नहीं पड़ता कि मैं उत्सुक लोडिंग का उपयोग कर रहा हूं या नहीं, क्योंकि यह 2 प्रश्नों को किसी भी तरह से चलाने वाला है?) – kfirba

+1

यह इस बात पर निर्भर करता है कि क्या डेटा जिसके बाद आप हैं यदि आप केवल हमारे मॉडल में संबंधित मॉडल-टिप्पणियों में रुचि रखते हैं, तो बस 'हैमनी()' संबंध विधि से पूछें: '$ उपयोगकर्ता = उपयोगकर्ता :: ढूंढें (1) -> टिप्पणियां; ', जो केवल जानकारी लौटाएगी टिप्पणियों के बारे में, उपयोगकर्ता नहीं। यदि, हालांकि, आपको प्रारंभिक मॉडल से डेटा तक पहुंचने की भी आवश्यकता है- उपयोगकर्ता- फिर '$ उपयोगकर्ता = उपयोगकर्ता :: जहां ('आईडी', '1') -> ('टिप्पणियां') -> get(); 'आपको एक संग्रह देगा जिसमें उपयोगकर्ता तालिका * और * उनकी संबंधित टिप्पणियों से डेटा शामिल होगा। किसी भी तरह से, 2 समान प्रश्न चल रहे हैं, लेकिन परिणामस्वरूप संग्रह अलग हैं। – damiani

+0

'लोड' हो सकता है जैसे 'से'' नेस्टेड किया जा सकता है? यहां की तरह - https://stackoverflow.com/questions/47048804/get-related-data-through-relation – Blagoh

संबंधित मुद्दे