2014-09-15 5 views
5

मैं एक वर्ग से अन्य वर्ग के साथ जुड़ने वाली इकाइयों को पुनर्प्राप्त करने का प्रयास कर रहा हूं। सभी संस्थाएं वास्तव में इकाइयों में शामिल नहीं हुई हैं।नलिका संबंधों के साथ तालिका में शामिल होने पर सिद्धांत प्रॉक्सी ऑब्जेक्ट देता है

यह निम्नलिखित बयान की तरह थोड़े है:

SELECT a, b FROM A a LEFT JOIN B b ON a.id = b.aid GROUP BY a.id; 

या कोड में:

$query_builder = $em->getRepository('repository_of_A')->createQueryBuilder('a'); 
$query_builder = $query_builder->leftJoin('a.b', b); 
$query_builder = $query_builder->groupBy('a.id'); 
$query = $query_builder->select('a, b')->getQuery(); 
$entities = $query->getResult(); 

अब समस्या है कि जब भी वहाँ है एक के लिए कोई इकाई बी, सिद्धांत एक प्रॉक्सी ऑब्जेक्ट ए के लिए क्योंकि मैं प्रतिबिंब के साथ काम करता हूं मुझे प्रॉक्सी की बजाय वास्तविक वस्तु की आवश्यकता होती है।

संलग्न स्क्रीनशॉट में इंडेक्स 26 के साथ ऑब्जेक्ट में ए (दुकान) के लिए कोई संबंधित इकाई बी नहीं है।

Shop Entity (A) is a Proxy

किसी को क्यों पता है और मैं इस समस्या को कैसे हल कर सकते हैं?

नोट: मुझे पता है कि मैं सिर्फ इकाई के बजाय classname जब प्रतिबिंब का उपयोग कर इस्तेमाल कर सकते हैं, लेकिन मैं यह भी यहाँ समस्या को समझने के लिए यह क्रम को प्रभावित कर सकता के रूप में चाहते हैं ...

संपादित करें : एक स्क्रीनशॉट

+0

अजीब लगता है। क्या इसके पास कोई और संगठन है? किसी भी घटना में, सिद्धांत 2 का उपयोग करते समय आपको प्रॉक्सी को संभालने में सक्षम होना चाहिए। – Cerad

+0

असल में बहुत अधिक संगठन हैं, लेकिन क्वेरी केवल ए और बी के लिए पूछती है, ठीक है, मैं यह सुनिश्चित करने के लिए कि 'प्रतिबिंब :: getClass (...)' का उपयोग करता हूं, यह सुनिश्चित करने के लिए कि प्रतिबिंब अभी भी काम करेंगे। हालांकि, मुझे अभी भी इसे हल करने में दिलचस्पी है .. – van

+0

अन्य संगठन आलसी लोडिंग का समर्थन करने के लिए प्रॉक्सी बनने का कारण बनेंगे। मेरे आस-पास का एकमात्र काम आपके लिए कुछ प्रकार का डेटा रूपांतरण करना होगा या अपना खुद का सिद्धांत 2 हाइड्रेटर बनाना होगा। लेकिन आपके प्रतिबिंब कोड समर्थन प्रॉक्सी के लिए बस अपनी सबसे अच्छी शर्त है। – Cerad

उत्तर

0

संलग्न मुद्दा यह है कि खेतों लोड नहीं कर रहे हैं, तो प्रतिबिंब की जांच का उपयोग कर यदि सिद्धांत इकाई लोड करने से पहले है और यह अन्यथा लोड:

if (
    $object instanceof \Doctrine\Common\Persistence\Proxy 
    && !$object->__isInitialized() 
) { 
    $object->__load(); 
} 
// ... your code 

लेकिन जैसा कि मैंने आपके स्क्रीनशॉट से देखा है, आपने इस मुद्दे को गलत तरीके से पहचान लिया है। यदि आप पहले a चुनते हैं (जैसा कि आपके उदाहरण में है), तो परिणाम सूची में कोई प्रॉक्सी नहीं होगी।

मुझे लगता है कि होगा, अपने उदाहरण में सभी दुकान संस्थाओं कुछ सहयोग से कर रहे हैं (क्वेरी के माध्यम से नहीं चुने गए, लेकिन $country->getShops(); से उदाहरण के लिए) और Shop [70] एक प्रॉक्सी केवल क्योंकि कहीं न कहीं से पहले उस बिंदु सिद्धांत पहले से ही भरी हुई है नहीं है। अगर इकाई मानचित्र में है (आईडी द्वारा) - इसका उपयोग प्रॉक्सी के बजाय किया जाता है क्योंकि यह पहले ही लोड हो चुका है।

+0

असल में मैं एक डीक्यूएल स्टेटमेंट का उपयोग करता हूं ताकि सभी दुकानें ऊपर दी गई किसी भी तरह की टिप्पणियों के साथ जुड़ सकें। स्क्रीनशॉट उस क्वेरी द्वारा दिए गए मेरे परिणाम सेट को दिखाता है। यही कारण है कि मैं प्रॉक्सी ऑब्जेक्ट को समझ नहीं पा रहा हूं। – van

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

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