2012-04-14 24 views
5

द्वारा एक QueryBuilder फ़िल्टर करना मैं अपने दो वर्गों User और Role है, और मैं एक QueryBuilder जो ROLE_PROVIDER भूमिका है जो उपयोगकर्ताओं के लिए एक प्रश्न रिटर्न बनाने की जरूरत है। मैं Symfony 2 में एक इकाई के रूप क्षेत्र पर्चा कक्षा परिभाषा मैंने कहा क्षेत्र के लिए निम्नलिखित स्निपेट है में के लिए इस की जरूरत है:सिद्धांत 2 Symfony 2 में - एक संघ

$builder->add('provider', 'entity', array(
    'class' => 'ElCuadreAccountBundle:User', 
    'property' => 'username', 
    'query_builder' => function(UserRepository $ur) { 
         return $ur->getUsersByRoleQB('ROLE_PROVIDER'); 
         }, 
    'required' => true, 
)); 

और फिर अपने कस्टम UserRepository में मैं निम्नलिखित समारोह है, जो एक लौटना चाहिए QueryBuilder वस्तु:

public function getUsersByRoleQB($role) { 
    $qb = $this->createQueryBuilder('u'); 
    return $qb->join('u.roles','r') 
       ->where($qb->expr()->in('r.role',$qb->expr()->literal($role))) 
       ->orderBy('u.username', 'ASC'); 
} 

बेशक यह काम नहीं करता है, लेकिन मैं इसे चिपकाया मेरी जरूरतों को वर्णन करने।

मैं चारों ओर देख रहा हूं और ऐसा लगता है कि Doctrine2 एक एसोसिएशन द्वारा मूल रूप से फ़िल्टरिंग का समर्थन नहीं करता है। this page में वे ऐसा कहते हैं, और इस तरह के फ़िल्टरिंग के लिए DQL का उपयोग करने का सुझाव देते हैं। मेरी समस्या यह है कि मुझे ऑब्जेक्ट को DQL वाक्य से बनाने का तरीका नहीं मिला है। यदि आप मुझे DQL क्वेरी के साथ भी प्रदान कर सकते हैं, तो मैं बहुत आभारी हूं ...

आपकी मदद के लिए धन्यवाद!

उत्तर

11

जहां वास्तव में आप चाहते हैं कि वास्तव में करना चाहिए। तुम बस वाक्य रचना 'में' के लिए गलत है:

यह

->where($qb->expr()->in('r.role',$qb->expr()->literal($role))) 

होना चाहिए

->where($qb->expr()->in('r.role',$role)) 

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

आप एक अच्छा सवाल उठाते हैं क्योंकि मुझे एसोसिएशन द्वारा फ़िल्टर करने की आवश्यकता है। मुझे लगता है कि डी 2.2 इसे बॉक्स के बाहर जाने की अनुमति देगा। मैं वास्तव में इसे करने की कोशिश नहीं की है, लेकिन मुझे लगता है कि

$dql = 'a,b FROM whatever...'; // Don't start with SELECT 
$qb->select($dql); 
return $qb; 

वास्तव में किसी भी अन्य भागों रूप में लंबे समय के लिए अपने अवकाश के रूप में $ DQL से बाहर वास्तविक 'चुनें' स्ट्रिंग निर्दिष्ट किए बिना काम करेंगे। Untested।

+0

धन्यवाद! वास्तव में पूरा जवाब ... एक प्रश्न, यह मूल प्रश्न से बहुत संबंधित नहीं है, लेकिन यहां मैं जाता हूं ... मैंने कई बार पढ़ा है कि सिम्फनी 2 और सिद्धांत 2 के नए संस्करण आ रहे हैं, और लोगों को ज्ञान है नई विशेषताएं, लेकिन मैं 'php bin/विक्रेताओं इंस्टॉल' चलाने से थक गया हूं, और यह न तो सिम्फनी और न ही सिद्धांत को अपग्रेड करता है ... मैं अपग्रेड कैसे कर सकता हूं? या उन नए संस्करण कब आधिकारिक होने जा रहे हैं ??? आपके उत्तर के लिए धन्यवाद!!! – Throoze

+0

आप यहां डी 2.2 के बारे में पढ़ सकते हैं: http://www.doctrine-project.org/। एस 2 में एस 2.1 जारी होने तक एस 2 में एकीकृत नहीं होगा, शायद इस गर्मी में। हालांकि आप सीधे D2.2 इंस्टॉल कर सकते हैं, autoload.php में अपने पथ समायोजित कर सकते हैं और, अधिकांश भाग के लिए, आपके सिद्धांत कोड को काम करना चाहिए। चीजों को देखने के लिए दस्तावेज़ों की जांच करें। – Cerad

+0

आपके उत्तरों के लिए धन्यवाद! – Throoze

3

भी सरल अभी भी आप कर सकते हैं:

->where('r.role IN (:role)') 
->setParameter('role', $role); 

मैं इतना जोड़ने से अधिक सुपाठ्य लगता है $ qb-> expr() ...

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