12

我在网上搜索并找不到任何可以向我展示一个很好的可靠示例的东西。我的问题基本上是这样的:

我如何转换这个:

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

与此类似的 Zend 语法:

$this ->select() ->from($this->_schema.'.'.$this->_name) ->where('a = ?', '1');

那么怎么做呢?

提前非常感谢。

4

4 回答 4

15

我有一个类似的问题。请参阅此处答案中的代码示例:使用 Zend_Db_Table_Abstract 对 WHERE 子句进行分组

所以你最终会得到类似的东西:

$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)
于 2010-04-15T14:21:30.620 回答
2

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

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

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

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

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

于 2014-03-26T14:28:11.970 回答
1

根据Zend Framework 网站上的留言板帖子,这可能是不可能的。

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

于 2010-04-14T18:51:08.370 回答
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,但可以将多个参数传递给whereand orWhere

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

于 2010-04-14T18:54:28.207 回答