2012-11-13 35 views
10

में जॉइन का उपयोग करके मुझे क्वेरीब्यूल्डर या डीक्यूएल का उपयोग करने की कोशिश करते समय कोई समस्या है।सिम्फनी 2/डॉक्टर एसक्यूएल

मैं निम्नलिखित संबंध है:

उपयोगकर्ता < -1: n-> प्रोफाइल < -n: m-> RouteGroup < -1: n-> मार्ग

मैं एक DQL करना चाहते हैं जो उन सभी मार्गों को सूचीबद्ध करता है जिन पर एक विशिष्ट उपयोगकर्ता का उपयोग होता है। मैं निम्नलिखित कोड के साथ इस बारे में जानकारी प्राप्त कर सकते हैं:

$usr = $this->container->get('security.context')->getToken()->getUser(); 
foreach ($usr->getProfiles() as $profile){ 
    foreach ($profile->getRoutegroups() as $routegroup){ 
     var_dump($routegroup->getRoutes()->toArray()); 
    } 
} 

स्पष्ट कारण मैं नहीं कर सकते इस कोड का उपयोग के लिए, अन्यथा मैं अपने सर्वर ओवरलोड जाएगा, LOL।

मैं निम्नलिखित दृष्टिकोण की कोशिश की:

DQL:

$em->createQuery('SELECT p FROM CRMCoreBundle:User u 
        JOIN CRMCoreBundle:Profile p 
        JOIN CRMCoreBundle:RoleGroup rg 
        JOIN CRMCoreBundle:Role r 
        WHERE 
        u.id=:user') 
     ->setParameter('user', $user->getId()) 
     ->getResult(); 

QueryBuilder (i u.profiles उपयोग करने की कोशिश - इकाई के बजाय रिश्ते का नाम है - लेकिन यह भी काम नहीं किया):

$em->createQueryBuilder() 
     ->select('r') 
     ->from('CRMCoreBundle:User', 'u') 
     ->innerJoin('u.profiles','p') 
     ->where('u.id = :user_id') 
     ->setParameter('user_id', $user->getId()) 
     ->getQuery() 
     ->getResult(); 

क्या कोई मदद कर सकता है ???

अद्यतन: मैं Zeljko के समाधान की कोशिश की और इस स्क्रिप्ट बनाया:

return $this->getEntityManager() 
     ->createQueryBuilder() 
     ->select('u, r') 
     ->from('CRMCoreBundle:User', 'u') 
     ->innerJoin('u.profiles','p') 
     ->innerJoin('p.routegroups','rg') 
     ->innerJoin('rg.routes','r') 
     ->where('u.id = :user_id')->setParameter('user_id', $user->getId()) 
     ->getQuery() 
     ->getResult(); 

लेकिन मैं यह त्रुटि आई:

The parent object of entity result with alias 'r' was not found. The parent alias is 'rg'. 

तो मैं बदल "-> का चयन करें ('यू, आर'

[Semantical Error] line 0, col -1 near 'SELECT r FROM': Error: Cannot select entity through identification variables without choosing at least one root entity alias. 
+1

अपने अपडेट का जवाब देने के लिए, आप केवल यू और आर का चयन नहीं कर सकते .. आर के रास्ते में सब कुछ भी चुना जाना है। तो आपको चुनने की जरूरत है ('यू, पी, आरजी, आर') – intrepion

उत्तर

20

कुछ विकल्पों की कोशिश करने के बाद मुझे पता चला कि मैं मार्गों से उपयोगकर्ताओं से शुरू करने के लिए एक व्यस्त लुकअप कर सकता हूं। समाधान निम्नानुसार था:

return $this->getEntityManager() 
     ->createQueryBuilder() 
     ->select('r') 
     ->from('CRMCoreBundle:Route', 'r') 
     ->innerJoin('r.routegroup','rg') 
     ->innerJoin('rg.profiles','p') 
     ->innerJoin('p.users','u') 
     ->where('u.id = :user_id') 
     ->setParameter('user_id', $user->getId()) 
     ->getQuery() 
     ->getResult(); 
+2

अब आपको बाएं-जुड़ने और आंतरिक-जुड़ने के बीच अंतर जानने की कोशिश करनी चाहिए, वे बहुत अलग हैं और आंतरिकज आपको सिरदर्द के बहुत से बचा सकते हैं। सबसे आसान तरीका; श्रेणी बनाने के कई उत्पाद संबंध हैं। श्रेणियों को लाने के दौरान, उत्पादों के आंतरिक जॉइन करें; आपको केवल उन्हीं श्रेणियां मिलेंगी जिनमें वास्तव में उत्पाद हैं। वास्तव में अच्छी चीज, विशेष रूप से जब आप इसे "साथ" खंड के साथ जोड़ते हैं। – Zeljko

+0

कोई समस्या नहीं है। मुझे पहले से ही आंतरिक और बाएं जुड़ने के बीच का अंतर पता है। –

3

अपने DQL में, आप फ़ेच कर रहे हैं उन बू: -) "को"> का चयन करें ('आर') "मैं इस मिल आपने पूछा कि मार्ग कैसे प्राप्त करें। वास्तव में आपको क्या चाहिए?

वैसे भी, RoutesRepository में:

$this->createQueryBuilder("r") 
    ->innerJoin("r.Profiles", "p") 
    ->innerJoin("p.User", "u") 
    ->where("u=:user")->setParameter("user", $user) 

मैं संबंध समझ में नहीं आता है, लेकिन मुझे लगता है कि आप अपने कोड को प्रतिबिंबित करने के बदल सकते हैं। आपको innerJoin का उपयोग करना चाहिए, बाएं जोइन नहीं।

+0

हाय, मैंने आपके समाधान की कोशिश की लेकिन मुझे एक और समस्या मिली। मैंने उपरोक्त प्रश्न को अद्यतन किया। क्या आप एक नज़र देख सकते हैं? धन्यवाद –

3

मैं सिद्धांत के साथ एक विशेषज्ञ नहीं हूं, लेकिन बस एक बहुत ही समस्या हल हो गई। मैंने कथन के SELECT भाग में शामिल होने वाली सभी इकाइयों को शामिल करके अपनी समस्या का समाधान किया।

मैंने इसका परीक्षण नहीं किया है, लेकिन यह काम करना चाहिए।

$em->createQuery('SELECT u, p, rg, r FROM CRMCoreBundle:User u 
       JOIN CRMCoreBundle:Profile p 
       JOIN CRMCoreBundle:RoleGroup rg 
       JOIN CRMCoreBundle:Role r 
       WHERE 
       u.id=:user') 
    ->setParameter('user', $user->getId()) 
    ->getResult(); 

मैं बिल्कुल पता नहीं क्यों, लेकिन अगर आप संस्थाओं को शामिल नहीं करते तो Hydrator उपनाम है कि आप संस्थाओं के लिए उपयोग कर रहे हैं के बारे में पता नहीं है।

मुझे उम्मीद है कि यह मदद करता है।