【发布时间】:2012-11-19 16:53:46
【问题描述】:
从 zf2 开始,使用 Zend\Db 查询 orWhere 不再可能 我在这里 (ZF2 How to orWhere()) 发现可以替换它。 在我的示例中,没有“喜欢”,只有一个类似的查询:
$select->where("....")->orWhere("...")
如果使用 PredicateSet 是唯一的方法,我该如何使用它来进行查询?
【问题讨论】:
标签: zend-framework2
从 zf2 开始,使用 Zend\Db 查询 orWhere 不再可能 我在这里 (ZF2 How to orWhere()) 发现可以替换它。 在我的示例中,没有“喜欢”,只有一个类似的查询:
$select->where("....")->orWhere("...")
如果使用 PredicateSet 是唯一的方法,我该如何使用它来进行查询?
【问题讨论】:
标签: zend-framework2
最简单的方法是使用流利的表示法:
$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。
Click here for ZF2's info on predicates
另外,最好以正确的方式使用命名空间;
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() 参见Zend\Db\Sql\Predicate\Predicate.php 中的代码
另请参阅有关where() 函数的Zend\Db\Sql\Select 文档,您可以传递第二个参数来定义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)
)
);
【讨论】: