Zend Framework 2 Sql Select的OR和AND查询

9

我希望使用Zend\Db\Sql\Select来进行此查询:

SELECT table1.* FROM table1 
    INNER JOIN table2 ON table1.columnA = table2.columnB 
    INNER JOIN table3 ON table1.columnC = table3.columnD

WHERE (table2.column2 = 2 or table3.column3 = 3) and table1.column1 = 1

ORDER BY table1.columnE ASC LIMIT 1

我目前有这段代码:

/*@var $db Adapter */
$db = $this->getServiceLocator()->get('db');
$sql = new Sql($db);
$select = $sql->select();

$select->from('table1');
$select->join('table2','table1.columnA = table2.columnB',array());
$select->join('table3','table1.columnC = table3.columnD',array());

$select->where(array('table2.column2' => 2, 'table2.column3' => 3), Predicate\PredicateSet::OP_OR);

$select->where(array('table1.column1' => 1),Predicate\PredicateSet::OP_AND);

$select->order('table1.columnE ASC');
$select->limit(1);

$statement = $sql->prepareStatementForSqlObject($select);
$resultSet = $statement->execute();

但是这并不起作用,因为会产生这样一个结果(没有OR中的"("和")"):
SELECT table1.* FROM table1 
    INNER JOIN table2 ON table1.columnA = table2.columnB 
    INNER JOIN table3 ON table1.columnC = table3.columnD

WHERE table2.column2 = 2 or table3.column3 = 3 and table1.column1 = 1

ORDER BY table1.columnE ASC LIMIT 1

我能帮你做什么呢?

2个回答

35

使用Where流畅接口从头部开始:

$select->where
       ->nest
           ->equalTo('table2.column2', 2)
           ->or
           ->equalTo('table2.column3', 3)
       ->unnest
       ->and
       ->equalTo('table1.column1', 1);

谢谢,我使用了 "$where = new \Zend\Db\Sql\Where();" 的创建方式,但这种方式也很好。 - leticia
@gsc-leticia,这个例子将覆盖任何已经存在的条件,因为$select->where($where)完全替换了Where对象。此外,不必要地创建额外的对象会稍微影响性能。 - Xerkus
你是对的,一切都很好,这个解决方案更加简单明了。 - leticia

6
我会这样做:

我会这样做:

$where = new \Zend\Db\Sql\Where();

$where
    ->nest()
    ->equalTo('table2.column2', 2)
    ->or
    ->equalTo('table2.column3', 3)
    ->unnest()
    ->and
    ->equalTo('table1.column1', 1);
$select->where($where)

仅仅因为这样,你的$select保持成为Zend\Db\Sql\SqlInterface的实现,同时执行以下操作:

$select->where
   ->nest

将返回Zend Sql运算符的实例。这并不坏,但是你不能仅仅这样做。
$statement = $sql->prepareStatementForSqlObject($select);
$resultSet = $statement->execute();

顺便提一下,使用另一种解决方案,我可以毫无问题地使用:$sql->prepareStatementForSqlObject($select); 和 $resultSet = $statement->execute();。 - leticia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接