2010-12-07 12 views
15

का उपयोग कर मैं इस जटिल कहां Zend_Db में खंड उत्पन्न करना चाहते Zend_Db साथ खंड:परिसर जहां कई व OR ऑपरेटर

SELECT * 
FROM 'products' 
WHERE 
    status = 'active' 
    AND 
    (
     attribute = 'one' 
     OR 
     attribute = 'two' 
     OR 
     [...] 
    ) 
; 

मैं इस की कोशिश की है:

$select->from('product'); 
$select->where('status = ?', $status); 
$select->where('attribute = ?', $a1); 
$select->orWhere('attribute = ?', $a2); 

और कहा कि उत्पादन:

SELECT `product`.* 
FROM `product` 
WHERE 
    (status = 'active') 
    AND 
    (attribute = 'one') 
    OR 
    (attribute = 'two') 
; 

मुझे यह काम करने का एक तरीका पता चला लेकिन मुझे लगा कि यह "या" को गठबंधन करने के लिए PHP का उपयोग करके 'धोखाधड़ी' पहले खंड और फिर Zend_Db का उपयोग करके उन्हें गठबंधन करें() खंड। PHP कोड:

$WHERE = array(); 
foreach($attributes as $a): 
    #WHERE[] = "attribute = '" . $a . "'"; 
endforeach; 
$WHERE = implode(' OR ', $WHERE); 

$select->from('product'); 
$select->where('status = ?', $status); 
$select->where($WHERE); 

जो मैंने बनाया था वह उत्पादित किया। लेकिन अगर मैं पहले PHP में संयोजन के बजाय, Zend_Db टूल का उपयोग करने के साथ उस जटिल जटिल कहां (जो वास्तव में बहुत जटिल नहीं है, केवल कुछ कोष्ठक जोड़ रहा है) प्राप्त करने का "आधिकारिक" तरीका है, तो मुझे उत्सुकता है।

चीयर्स! ,

$a1 = 'one'; 
$a2 = 'two'; 
$select->from('product'); 
$select->where('status = ?', $status); 
$select->where("attribute = $a1 OR attribute = $a2"); 

तो, तुम क्या कर रहे उचित प्रतीत होता है आपको लगता है कि दिए गए:

उत्तर

20

इस रूप में निर्दिष्ट (Zend_Db_Select दस्तावेज में देख उदाहरण # 20) 'सरकारी' जिस तरह से आप कोष्ठकों प्राप्त करने के लिए किया जाएगा पता नहीं है कि आपके पास समय से कितने गुण हैं।

+0

हाँ, आपका समाधान, ZF संदर्भ मार्गदर्शिका से, आपका मूल उदाहरण है कि मैं अपने अंतिम उदाहरण के साथ कैसे आया हूं। शायद यह करने के लिए सही तरीका है। यह सिर्फ काउंटर-अंतर्ज्ञानी लगता है कि Zend_Db_Select (ZDS) आपके लिए आपके SQL उत्पन्न करने का अनुमान है, लेकिन हमें ZDS के बाहर इसका एक हिस्सा उत्पन्न करना होगा। शायद, यह ऐसा कुछ है जो एक्सटेंशन का उपयोग कर सकता है ताकि हम सभी कोड Zend_Db_Select में रख सकें। – jmbertucci

+0

[Zend_Db_Select] (http://framework.zend.com/manual/1.12/en/zend.db.select.html) लिंक मेरे लिए काम नहीं करता है यहां दस्तावेज़ों के लिए एक अद्यतन लिंक है। –

0

मैं इस समाधान का उपयोग करता हूं और ऐसा लगता है कि यह वांछित काम करता है।

$select->from('product'); 
$select->where('status = ?', $status); 
$select->where('(attribute = ?', $a1); 
$select->orWhere('attribute = ?)', $a2); 
2

तो चुने हुए जवाब आप एसक्यूएल इंजेक्शन से सुरक्षा के लिए क्वेरी निर्माण करने से पहले मूल्यों उद्धृत करने के लिए याद करने की आवश्यकता होगी का उपयोग कर। इस तरह Zend Db चुनें सभी एसक्यूएल generatation करता

/// we just use this select to create the "or wheres" 
$select1->from('product'); 
foreach($attributes as $key => $a) { 
    if ($key == 0) { 
    /// we don't want "OR" for first one 
     $select1->where("attribute = ?", $a); 
    } else { 
     $select1->orWhere("attribute = ?", $a); 
    } 
} 

/// now we construct main query 
$select2->from('product'); 
$select2->where('status = ?', $status); 
$select2->where(implode(' ', $select1->getPart('where'))); 

:

एक अन्य विकल्प क्वेरी बनाने के लिए Zend Db का चयन का उपयोग करता है और यह भी कि उद्धरण मूल्यों 2 चरणों में यह करने के लिए किया जाएगा। एक पुराना सवाल है लेकिन आशा है कि यह विचार किसी भी समस्या के साथ किसी के लिए उपयोग किया जा सकता है।

0

अपनी विशेषता एक ही तालिका स्तंभ है और आप कई मानों में से एक के बराबर के लिए यह जाँच करना चाहते हैं, की तुलना में आप में उपयोग कर सकते हैं:

$select->from('product'); 
$select->where('status = ?', $status); 
$select->where('attribute IN (?)', [$a1, $a2, ...]); 

या

$select->where('attribute IN (:someName)'); 
$select->setParameter('someName', [$a1, $a2, ...]); 

अन्यथा मैं देख रहा हूँ "attribute = $a1 OR attribute = $a2"