2010-04-14 108 views
10

我搜索了網頁,找不到任何能夠給我看一個很好的實例的東西。我的問題基本上是這樣的:如何將複雜的where子句添加到Zend Table Select?

如何轉換這樣的:

SELECT * FROM表WHERE((A = 1和B = 2)或(C = 3或C = 4))和d = 5 ;

要Zend的語法與此類似:

$此 - >選擇() - >從( - ''。$本> _模式$此 - > _名) - >在哪裏(」 a =?','1');

那麼該怎麼辦?

預先感謝了很多。

回答

14

我也有類似的問題。看到答案這裏的代碼示例:Grouping WHERE clauses with Zend_Db_Table_Abstract

所以,你最終會得到這樣的:

$db = $this->getAdapter(); 
$this->select() 
    ->where('(' . $db->quoteInto('a = ?', 1) . ' AND ' . $db->quoteInto('b = ?', 2) . ') OR (' . $db->quoteInto('c = ?', 3) . ' OR ' . $db->quoteInto('c = ?', 4) . ')') 
    ->where('d = ?', 5); 

這將使你:

SELECT `table_name`.* FROM `table_name` WHERE ((a = 1 AND b = 2) OR (c = 3 OR c = 4)) AND (d = 5) 
+0

這可能會起作用。我需要嘗試一下。 – 2010-04-15 14:33:20

1

根據Zend Framework網站上的message board post,這可能是不可能的。

在我看來,Zend_Db_Select類中的where()和orWhere()不足以寫入所有查詢。它不支持嵌套條件,在較複雜的情況下不會強制用戶進行抽象。與在()和orWhere()我不能寫:

0

編輯

Zend_Db_Select->where陣列功能僅設計用於使用它與IN子句。

Example #17 Example of an array parameter in the where() method 
// Build this query: 
// SELECT product_id, product_name, price 
// FROM "products" 
// WHERE (product_id IN (1, 2, 3)) 

$productIds = array(1, 2, 3); 

$select = $db->select() 
      ->from('products', 
        array('product_id', 'product_name', 'price')) 
      ->where('product_id IN (?)', $productIds); 

原始

作爲Peder說你不能嵌套 orWhere,但你可以通過多個參數爲 whereorWhere

$this->select() 
    ->from($this->_schema.'.'.$this->_name) 
    ->where(' (a = ? AND b = ?) OR (c = ? OR c = ?) ', array(1,2,3,4)) 
    ->where('d = ?',array(5)); 

+1

-1。這會將每個'?'替換爲內容'array(1,2,3,4)'產生一個查詢'SELECT'table「。」col「FROM」table「WHERE((a = 1,2,3, 4 AND b = 1,2,3,4)OR(c = 1,2,3,4或者c = 1,2,3,4))AND(d = 5)' – 2010-04-14 19:14:23

+0

你是對的。我似乎記得有人在Stack Overflow上顯示了這個「功能」。 – Ballsacian1 2010-04-14 20:11:44

+0

那麼,有沒有辦法做到這一點與哪裏或什麼地方功能? – 2010-04-14 20:33:29

1

1)建立所有羣體的條件Where/orWhere:

$conditions = $this->select() 
     ->where('a= ?', 5) 
     ->orWhere('b= ?', 6) 
     ->getPart(Zend_Db_Select::WHERE); 
// result: $conditions = "(a= 5) OR (b= 6)"; 

使用getPart()方法獲取where條件。

2)下一步,復位WHERE CURRENT選擇對象的一部分:

$this->select()->reset(Zend_Db_Select::WHERE); 

3)最後,使用在那裏,只要你想的條件:

$this->select() 
    ->where('d= ?', 5) 
    ->where(implode(' ', $conditions)); 

http://framework.zend.com/manual/1.12/ru/zend.db.select.html