प्रॉक्सी
एक डॉक्ट्रिन प्रॉक्सी सिर्फ एक आवरण है जो इसके लिए आलसी लोडिंग प्रदान करने के लिए एक इकाई वर्ग का विस्तार करता है।
डिफ़ॉल्ट रूप से, जब आप एंटिटी मैनेजर से उस इकाई के लिए पूछते हैं जो किसी अन्य इकाई से संबद्ध है, तो संबंधित इकाई डेटाबेस से लोड नहीं होगी, लेकिन एक प्रॉक्सी ऑब्जेक्ट में लिपटेगी। जब आपका आवेदन तब एक संपत्ति का अनुरोध करता है या इस अनुमानित इकाई का एक तरीका कहता है, तो डॉक्ट्रीन इकाई को डेटाबेस से लोड कर देगा (जब आप आईडी का अनुरोध करते हैं, जो हमेशा प्रॉक्सी के लिए जाना जाता है) को छोड़कर।
यह इस तथ्य के कारण आपके आवेदन के लिए पूरी तरह से पारदर्शी होता है कि प्रॉक्सी आपके इकाई वर्ग का विस्तार करता है।
यदि आप JOIN
उन्हें अपनी क्वेरी में नहीं रखते हैं या लाने के लिए मोड सेट करते हैं, तो डॉक्ट्रीन डिफ़ॉल्ट लोड प्रॉक्सिज़ के रूप में डिफ़ॉल्ट हाइड्रेट संघों द्वारा करेगा EAGER
।
अब मुझे इसे जोड़ना होगा क्योंकि मेरे पास हर जगह टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है:
दुर्भाग्य से, क्रोज़िन के उत्तर में गलत सूचना है।
यदि आप DQL क्वेरी को निष्पादित करते हैं, जैसे
SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id
आपको एक (अनुमानित) इकाई ऑब्जेक्ट नहीं मिलेगा, लेकिन एक सहयोगी सरणी। इसलिए किसी अतिरिक्त गुण को आलसी करना संभव नहीं है।
इसे ध्यान में रखते हुए, एक निष्कर्ष पर पहुंचता है कि उपयोग के मामले का उदाहरण या तो काम नहीं करेगा। $article
ऑब्जेक्ट के रूप में एक्सेस करने के लिए DQL को कुछ इस तरह बदलना होगा :
SELECT a FROM Entity\Article a ORDER BY a.createdAt DESC LIMIT 25
और सभी 25 संस्थाओं getContent()
की सामग्री संपत्तियों को लोड नहीं करने के लिए एसोसिएशन द्वारा लौटा दी गई संपत्ति एक संघ होना चाहिए ।
आंशिक वस्तुएं
यदि आप आंशिक रूप से उन इकाई गुणों को लोड करना चाहते हैं जो एसोसिएशन नहीं हैं, तो आपको इस सिद्धांत को स्पष्ट रूप से बताना होगा:
SELECT partial u.{id, username} FROM Entity\User u WHERE u.id = :id
यह आपको आंशिक रूप से भरी हुई इकाई वस्तु देता है।
लेकिन सावधान रहें कि आंशिक वस्तुएं समीप नहीं हैं! आलसी लोडिंग उन पर लागू नहीं होती है। इसलिए, आंशिक वस्तुओं का उपयोग करना आम तौर पर खतरनाक है और इससे बचा जाना चाहिए। और पढ़ें: आंशिक वस्तुएं - सिद्धांत 2 ओआरएम 2 प्रलेखन