2012-02-01 5 views
52
WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2) 

मैं इसे सिद्धांत में कैसे बना सकता हूं?सिद्धांत का उपयोग कैसे करें और सिद्धांत में कहां और कहाँ?

$q->where("a = 1"); 
$q->andWhere("b = 1") 
$q->orWhere("b = 2") 
$q->andWhere("c = 1") 
$q->orWhere("d = 2") 

इस नहीं है सही ढंग से ... होना चाहिए:

$q->where("a = 1"); 
$q->andWhere("b = 1") 
    $q->orWhere("b = 2") 
$q->andWhere("c = 1") 
    $q->orWhere("d = 2") 

लेकिन मैं यह कैसे कर सकते हैं? प्रोपेल में फ़ंक्शन getNewCriterion, और सिद्धांत में ... है?

उत्तर

82
$q->where("a = 1") 
    ->andWhere("b = 1 OR b = 2") 
    ->andWhere("c = 2 OR c = 2") 
    ; 
+6

तो क्यों न केवल इसे 'कहाँ()' कॉल में डालें? – MatBailie

+3

मैं इस तरह के वाक्यविन्यास से संतुष्ट नहीं होगा ... क्या होगा यदि आप कुछ बीमार प्रकार के "एसक्यूएल" में माइग्रेट करने का प्रयास करते हैं, जहां 'OR' को '||' द्वारा प्रतिस्थापित किया जाएगा ... यह कैसे काम करता है, कब आपको 'बी = का उपयोग करने की आवश्यकता है? या बी =? ' – Vyktor

+0

@ डेम्स हां, यह निश्चित रूप से संभव है। यह विधि तेज है, थो। – Maerlyn

11

क्यों न सिर्फ

$q->where("a = 1"); 
$q->andWhere("b = 1 OR b = 2"); 
$q->andWhere("c = 1 OR d = 2"); 

संपादित: तुम भी Expr class (Doctrine2) का उपयोग कर सकते हैं।

$qb->where('o.foo = 1') 
    ->andWhere($qb->expr()->orX(
     $qb->expr()->eq('o.bar', 1), 
     $qb->expr()->eq('o.bar', 2) 
    )) 
    ; 

उन Czechnology जवाब में उल्लेख किया अभिव्यक्ति कर रहे हैं:

+0

प्रश्न सिद्धांत 1.2 के लिए है, आपके द्वारा लिंक किए गए दस्तावेज़ 2.0 के लिए हैं। – Maerlyn

+4

@Maerlyn, ठीक है, प्रश्न में 'सिद्धांत-1.2' टैग नहीं है, इसलिए मैं यह सुनिश्चित नहीं कर सकता कि उपयोगकर्ता का क्या मतलब है - उस स्थिति में मैं निश्चित रूप से सबसे वर्तमान की अपेक्षा करता हूं। – Czechnology

+0

मेरी गलती, पता नहीं था कि वहाँ और कहाँ और कहां सिद्धांत 2 के प्रश्न निर्माता में। – Maerlyn

39

यहाँ जो लोग QueryBuilder साथ और अधिक जटिल स्थिति और सिद्धांत 2. * का उपयोग कर के लिए एक उदाहरण है।

+1

ने मेरी मदद की। चीयर्स :) – Sharpy35

+0

जीवन बचतकर्ता :) धन्यवाद – Hooli

0

एक बात यहाँ याद आ रही है: यदि आप तत्वों है कि आप की तरह

WHERE [...] AND (field LIKE '%abc%' OR field LIKE '%def%') 

कुछ करने के लिए एक साथ रखना चाहते हैं और न का एक अलग संख्या है एक DQL-स्ट्रिंग अपने आप को इकट्ठा करने के लिए आप orX उल्लेख उपयोग कर सकते हैं चाहते हैं, इस तरह से ऊपर:

$patterns = ['abc', 'def']; 
$orStatements = $qb->expr()->orX(); 
foreach ($patterns as $pattern) { 
    $orStatements->add(
     $qb->expr()->like('field', $qb->expr()->literal('%' . $pattern . '%')) 
    ); 
} 
$qb->andWhere($orStatements);