2011-08-04 4 views
20

मेरे पास ऐसी संस्थाएं हैं जिन्हें मैं बेसब्री से लोड करना चाहता हूं, और अन्य ocassions आलसी (या यहां तक ​​कि अतिरिक्त आलसी) लोड पर भी।सिद्धांत 2 में प्राप्त मोड (उत्सुक/आलसी इत्यादि) रनटाइम पर बदला जा सकता है?

मेरे मैपिंग्स में मेरे वाईएएमएल में कोई fetch मोड घोषित नहीं किया गया है- इसलिए वे डिफ़ॉल्ट (आलसी लोडिंग) का उपयोग करते हैं।

वर्तमान में लोड बेसब्री लिए एक ही रास्ता मैन्युअल DQL का निर्माण करके करने के लिए है - और मैं इस हर बार जब मैं एक नई इकाई जोड़ने के अपडेट करना होगा।

आदर्श रूप में मैं केवल मूल इकाई लोड करता हूं और बल सभी संबंधित वस्तुओं को लोड करने के लिए उत्सुक होता है। क्या कोई और तरीका है इसे करने के लिए?

यदि नहीं, तो क्या यह एक अनुपूरक सुविधा होने से परे कोई कारण है)?

उत्तर

20

आप में निर्मित भंडार तरीकों का उपयोग करना चाहते हैं (, लगता है() findAll()), तो आप शायद भाग्य से बाहर हो जब तक आप चीजों को अपने एनोटेशन में लोड बेसब्री से करने के लिए निर्धारित किया है।

आप शायद आप जहां चाहें, उत्सुक लोड हो रहा है मजबूर करने के लिए कुछ कस्टम भंडार की विधि में क्वेरी बिल्डर (या कच्चे DQL) का उपयोग करना चाहते हैं। हां, आपको उस विधि को अपडेट करना होगा जब आप इकाइयों को जोड़ते हैं, लेकिन कम से कम आप हमेशा आलसी/उत्सुक लोडिंग के संबंध में क्या चल रहे हैं, और आपको केवल एक ही स्थान पर इसे बनाए रखने की आवश्यकता होगी।

मुझे लगता है कारण वहाँ कुछ $ eagerLoad झंडा लगाने के लिए(), आदि नहीं है, इसलिए है क्योंकि वो सरल कार्य के लिए सुविधा तरीके हैं। यदि आप ऐसा ध्वज जोड़ना चाहते हैं, तो आप जल्दी से परिस्थितियों में आ जाएंगे जहां आप गहराई से आवर्ती लोडिंग को सीमित करना चाहते हैं। आपको शायद चक्रीय संदर्भों (उदाहरण के लिए, कोई भी बिडरेक्शनल एसोसिएशन) के बारे में चिंता करना शुरू करना होगा।

+0

प्रतिक्रिया के लिए धन्यवाद। अगर कोई और राय देना चाहती है तो मैं थोड़ी देर के लिए सवाल खुलूंगा। – calumbrodie

+2

परिणाम में संबंधित इकाइयों को शामिल करने के लिए 'addSelect ('alias') 'में सभी शामिल टेबल उपनाम जोड़ने के लिए याद रखें। – juanmf

21

आप सेट मोड में setFetchMode() विधि का उपयोग कर सकते हैं। दस्तावेज़ देखें: http://readthedocs.org/docs/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#temporarily-change-fetch-mode-in-dql

+2

ध्यान दें कि इसका उपयोग केवल कई-से-वन और वन-टू -ऑन एसोसिएशन – murtho

+4

के लिए किया जा सकता है क्योंकि मैंने अभी 2 घंटे खो दिए हैं, setFetchMode में पहला पैरामीटर वर्तमान वर्ग का संदर्भ लेना चाहिए, न कि कक्षा जिसे हम आलसी करना चाहते हैं या उत्सुक होना चाहते हैं । और कक्षा को एपबंडल \ Entity \ Student (उदाहरण के रूप में इसे प्रदर्शित करने की तरह) संकेत दिया जाना चाहिए –

+0

2 घंटे? मुझे 2 दिनों के साथ गिनें! यह पागल है कि यह सिम्फनी में कितना परेशान है:/ – Sliq

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