Zend framework2 Zend Framework 2 Sql Select带或和
我想使用Zend\Db\Sql\Select进行此查询:Zend framework2 Zend Framework 2 Sql Select带或和,zend-framework2,zend-db,Zend Framework2,Zend Db,我想使用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 ORD
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生成这个(没有“(“and”)”):
我能做什么?从头顶使用Where fluent界面:
$select->where
->nest
->equalTo('table2.column2', 2)
->or
->equalTo('table2.column3', 3)
->unnest
->and
->equalTo('table1.column1', 1);
我会这样做:
$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();
谢谢,我使用了“$where=new\Zend\Db\Sql\where();”的创建,但这也很好。@gsc leticia该示例将覆盖任何已经存在的条件,因为
$select->where($where)
完全替换了where对象。另外,不必要的额外对象创建虽然很小,但是性能很好。你是对的,所有的工作都很好,而且这个解决方案更直接。顺便说一句,使用我可以使用的另一个解决方案:$sql->prepareStatementForSqlObject($select);和$resultSet=$statement->execute();没问题。
$statement = $sql->prepareStatementForSqlObject($select);
$resultSet = $statement->execute();