2012-06-18 12 views
11

हैलो मेरे पास सिम्फनी 2 एप्लिकेशन में तीन सिद्धांत 2 इकाइयां हैं: दो ("प्रोमो" और "प्रोमोपेरियोड") बंडल में Acme: प्रोमोबंडल; बंडल Acme में एक ("दुकान"): ShopBundle। संबंध हैं: प्रोमो - प्रोमोपीरियोड: कई से एक। प्रोमोपेरियोड - दुकान: एक से कईविभिन्न सिम्फनी 2 बंडलों से कई इकाइयों पर चयन के साथ सिद्धांत 2 क्वेरी

इकाई "प्रोमो" का भंडार में, मैं सब प्रोमो पाने के लिए और दुकानों के रूप में इस प्रयास करें:

return $this->getEntityManager() 
     ->createQuery("SELECT p, s 
      FROM AcmePromoBundle:Promo p JOIN p.period pp JOIN pp.shops s") 
      ->getResult(); 

जहां: p.period प्रोमो उदाहरण पी और PromoPeriod अवधि के बीच संबंध है ; पीपी.शॉप प्रोमोपेरियोड पीपी और दुकानों के बीच संबंध है। ने निम्नलिखित त्रुटि है:

An exception has been thrown during the rendering of a template 
("The parent object of entity result with alias 's' was not found. 
The parent alias is 'pp'.") 

तो, मैं ने तर्क दिया कि सिद्धांत के बाद से यह एक और बंडल में स्थित है, "एस" (जो एक दुकान इकाई है) के प्रकार को समझने में सक्षम नहीं है। इसलिए मैंने खंड का एक इंस्टॉलेशन जोड़ने की कोशिश की:

SELECT p, s 
FROM AcmePromoBundle:Promo p JOIN p.period pp JOIN pp.shops s 
WHERE s INSTANCE OF AcmeShopBundle:Shop 

और फिर कुछ भी नहीं। शायद यह समस्या को हल करने का तरीका नहीं है।

कोई विचार?

+0

क्या होगा यदि आप FQCN का उपयोग पढ़ें? –

+0

मुझे एफक्यूसीएन का उपयोग कैसे करना चाहिए? याद रखें कि Doctrine2 SQL क्वेरी में एक अलग तरीके से तैयार किया गया है, क्योंकि Doctrine2 एक ओआरएम है। – JeanValjean

+0

एमएमएम, एमएमएम, एफक्यूसीएन = पूरी तरह से योग्य वर्ग का नाम, जिस तरह से आप इकाई का चयन करते हैं वह एक डॉक्टर 2 उपनाम (AcmePromoBundle) का उपयोग कर रहा है। उपनाम का उपयोग क्वेरी लिखते समय इकाई नाम को शॉर्टकट करने के लिए किया जाता है, यह सीधे वास्तविक नामस्थान पर मैप किया जाता है। मैंने आपको एफक्यूसीएन का उपयोग करने के लिए कहा है कि यह एक एलियासिंग समस्या है या नहीं। एफक्यूसीएन का चयन करना आपके आवेदन के किसी भी हिस्से में काम करना चाहिए। –

उत्तर

23

आप 3 संस्थाओं का चयन करना चाहिए आप एक लाने में शामिल होने के कर रहे हैं, यानी इतने

SELECT p, pp, s 
FROM AcmePromoBundle:Promo p 
JOIN p.period pp 
JOIN pp.shops s 

की तरह,: सिद्धांत क्वेरी (यहाँ प्रोमो (रों)) की जड़ की संस्थाओं वापस आ जाएगी, और अतिरिक्त चयन इकाइयों के साथ इसे हाइड्रेट करें। तो यदि आप दुकानों को लोड करने के लिए सिद्धांत बताते हैं, तो वह अवधि से "आओ", लेकिन अवधि का चयन न करने के लिए ... वह वह नहीं कर सकता जो आप इसे करने के लिए कह रहे हैं। यहां, एसक्यूएल क्वेरी ठीक हो जाती है, यह तब होता है जब सिद्धांत ऑब्जेक्ट को हाइड्रेट करने का प्रयास करता है कि यह अपवाद फेंकता है।

संबंधित दस्तावेज़ http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#joins

+0

ठीक है, आप सही हैं, कोई त्रुटि वापस नहीं आती है!हालांकि, केवल 'पी' ऑब्जेक्ट्स लौटा दिए जाते हैं, इसके बावजूद कि 'पीपी' और' ऑब्जेक्ट्स भी चुने गए हैं! यह सामान्य प्रतीत नहीं होता है! – JeanValjean

+1

लेकिन पीपी और एस अब पी के माध्यम से उपलब्ध हैं – phonixor

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