Zend.DB:如何对“orWhere()”子句进行分组?

时间:2013-03-21 20:42:08

标签: php sql zend-db

我有一个小任务我必须处理,虽然我可以只是使用query()函数手写出SQL,但我 < em>真的 有兴趣了解这一点。

注意:我在ZF上非常环保(尤其是作为框架)..我只是将数据库用作lib。

期望的结果:
我希望我的sql看起来像是:

SELECT name, phone, email 
FROM company 
WHERE name = 'Acme Anvil Corp' 
AND ( category1 = 'abc' 
      OR category3 = 'klm'
      OR category8 = 'xyz'
    )


我到目前为止所处的位置:

$select = $db 
            ->select() 
            ->from('company, array('name', 'phone', 'email'))
            ->where('name = ?', 'Acme Anvil Corp')
            ->limit(1);

在那之后,我被惹恼了 添加一大堆orWhere()的jut将无法获得理想的结果 如何在集体分组orWhere()中添加一堆()


或者,我考虑过试图让我的SQL看起来更像是:

SELECT c.name, c.phone, c.email 
FROM  (
        SELECT name, phone, email 
        FROM company
        WHERE category1 = 'abc' 
        OR category3 = 'klm'
        OR category8 = 'xyz'
      ) AS c
WHERE c.name = 'Acme Anvil Corp'

(我不是SQL大师,所以如果这两者之间存在显着差异,请不要羞于反馈:)

再次,只是不确定如何处理它。

1 个答案:

答案 0 :(得分:1)

use Zend\Db\Sql\Predicate;

$select->where(array(
    // ...
    new Predicate\PredicateSet(
        array(
            new Predicate\Like('content', '%'.$searchstring.'%'),
            new Predicate\Like('title', '%'.$searchstring.'%'),
        ),
        Predicate\PredicateSet::COMBINED_BY_OR
    ),
    // ...
));

此外,

$predicate = new  \Zend\Db\Sql\Where();
$sql->where($predicate->greaterThan('filterColumn', '20'));
$sql->where($predicate->greaterThan('filterColumn', '30'), 'OR');