2012-03-22 10 views
11

मुझे क्लॉज जोड़ने के बाद getListQueryBuilder द्वारा क्वेरी बिल्डर को OR अभिव्यक्तियों को गतिशील रूप से जोड़ना होगा। मुझे ऐसा करने का कोई उपयुक्त तरीका नहीं मिल रहा है, मैं सिर्फ सिद्धांत सीखना शुरू कर रहा हूं।Doctrine2 क्वेरी बिल्डर में चेनिंग ORX

मैं orX की किसी दिए गए संख्या को "चेन" कैसे कर सकता हूं और उन्हें अपने निर्माता में जोड़ सकता हूं?

public function getListQueryBuilder($ownerId) 
{ 
    $qb = $this->createQueryBuilder('t'); 

    return $qb 
     ->where($qb->expr()->eq('t.user', ':user')) 
     ->setParameter('user', $ownerId); 
} 

$builder = getListQueryBuilder(4); 

// $ORs is a dynamically builded array, here is just an example 
$ORs = array(); 
$ORs[] = $builder->expr()->like("t.name", 'my name'); 
$ORs[] = $builder->expr()->like("t.description", 'desc'); 

// Adding ORs to the builder 
$builder->andWhere($builder->expr()->orX(/* here */)); 

उत्तर

20

आप देख सकते हैं this solution:

$orX = $builder->expr()->orX(); 
foreach($ORs as $or) { 
    $orX->add($or); 
} 
$builder->andWhere($orX); 
+7

आप पूरा लेख पढ़ने के लिए चाहते हैं, तो: $ orX = $ बिल्डर-> expr() -> orX(); foreach ($ ORs $ या $ { $ orX-> जोड़ें ($ या); } $ बिल्डर-> और कहां ($ ORX); –

+1

@LouTerrailloune जो उत्तर का हिस्सा बनना चाहिए –

+0

यह मेरे लिए चाल है! इसे इंगित करने के लिए चीयर्स :) – Sharpy35

8

मैं एक ही समस्या पर ठोकर खाई और करने की कोशिश की:

$builder->andWhere($builder->expr()->orX($ORs)); 

लेकिन यह काम नहीं करता कॉल के बाद से orX "नए Expr \ Orx वापसी (func_get_args()); "

$builder->andWhere($builder->expr()->orX()->addMultiple($ORs)); 

या लेकिन सब पर प्रयोग करते हैं $ अन्य रैंकों तालिका: आंतरिक और आप सरणी की तरह कुछ (सरणी (or1, or2))

एपीआई को देखा होने तथापि मैं आप ऐसा कर सकते लगा के साथ खत्म मुद्दा:

$orx = $builder->expr()->orX(); 
$orx->add($builder->expr()->like("t.name", 'my name')); 
$orx->add($builder->expr()->like("t.description", 'desc')); 
$builder->andWhere($orx); 
संबंधित मुद्दे