如何在Zend Table Select中添加复杂的where子句?

时间:2010-04-14 18:44:46

标签: zend-framework zend-db zend-db-table

我在网上搜索过,找不到能给我展示一个好例子的东西。我的问题基本上是这样的:

我如何转换它:

SELECT * FROM表WHERE((a = 1 AND b = 2)OR(c = 3 OR c = 4))AND d = 5;

To Zend语法类似于:

$这   - > select()的   - >从(; ''。$这 - &GT _schema $这 - > _name)   - > where('a =?','1');

那怎么办呢?

提前多多感谢。

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

1)为所有组建立一个条件Where /或Where:

$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部分:

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

3)最后,根据需要使用where where条件:

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

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

答案 2 :(得分:1)

在Zend Framework网站上每message board post,这可能是不可能的。

  

在我看来,Zend_Db_Select类中的where()和orWhere()不足以能够编写所有查询。它不支持条件的嵌套,这在某些更复杂的情况下不会强制用户进行抽象。使用where()和orWhere()我不能写这个:

答案 3 :(得分: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));

<击>