由于 zf2, orWhere 在 Zend\Db 的查询中不再可能,我在这里发现(ZF2 How to orWhere())可以替换它。在我的示例中,没有“喜欢”,只有如下查询:
$select->where("....")->orWhere("...")
如果使用 PredicateSet 是唯一的方法,我该如何使用它来进行查询?
由于 zf2, orWhere 在 Zend\Db 的查询中不再可能,我在这里发现(ZF2 How to orWhere())可以替换它。在我的示例中,没有“喜欢”,只有如下查询:
$select->where("....")->orWhere("...")
如果使用 PredicateSet 是唯一的方法,我该如何使用它来进行查询?
最简单的方法是使用流利的表示法:
$where = new Zend\Db\Sql\Where;
$where->OR->equalTo('id', $id);
如有疑问,请查看 Ralph 在他的 Zend_Db-Examples 存储库 ( https://github.com/ralphschindler/Zend_Db-Examples ) 中发布的示例。
orPredicate可以用于Where() ,如下所示:
public function fetchLike($keyword)
{
$where = new \Zend\Db\Sql\Where();
$pred_url = new \Zend\Db\Sql\Predicate\Like('url', '%' . $keyword . '%');
$pred_notes = new \Zend\Db\Sql\Predicate\Like('notes', '%' . $keyword . '%');
$pred_username = new \Zend\Db\Sql\Predicate\Like('username', '%' . $keyword . '%');
$where->orPredicate($pred_url)->orPredicate($pred_notes)->orPredicate($pred_username);
$resultSet = $this->tableGateway->select($where);
return $resultSet;
}
当然,您可以使用lessThanOrEqualTo、equalTo等谓词来代替我使用的那种谓词。您也可以使用andPredicate代替orPredicate。
此外,最好以适当的方式使用命名空间;
use \Zend\Db\Sql\Predicate\Like;
use \Zend\Db\Sql\Where;
// Now you can use code like this:
$pred_url = new Like('url', '%' . $keyword . '%');
// Instead of
$pred_url = new \Zend\Db\Sql\Predicate\Like('url', '%' . $keyword . '%');
现在称为orPredicate()
See code insideZend\Db\Sql\Predicate\Predicate.php
另请参阅Zend\Db\Sql\Select关于where()
函数的文档,您可以传递第二个参数来定义AND
或OR
对于您的示例,如果您不使用 LIKE,则可以按如下方式进行(我自己正在寻找解决方案):
$select->where(
array(
new \Zend\Db\Sql\Predicate\PredicateSet(array(
new \Zend\Db\Sql\Predicate\Operator('first_column', \Zend\Db\Sql\Predicate\Operator::OPERATOR_EQUAL_TO, $some_value),
new \Zend\Db\Sql\Predicate\Operator('second_column', \Zend\Db\Sql\Predicate\Operator::OPERATOR_EQUAL_TO, $some_value)
/* even more columns to compare this way... */
),
\Zend\Db\Sql\Predicate\PredicateSet::COMBINED_BY_OR)
)
);