我想用Doctrines Criteria
创建一个相当复杂和灵活的查询。我有一个andWhere
包含在每个查询中,但随后(取决于输入)我想用orWhere
添加一些optinal参数。
$criteria = Criteria::create();
/* Add Criteria for last 55 Days (every query) */
$criteria->where(Criteria::expr()->gte('gameCreation', $long));
/* Gather optional Params */
$orxList = array();
/* Optional Criteria */
if (!empty($champions)) {
foreach ($champions as $c) {
$orxList[] = Criteria::expr()->eq('champion',$c);
}
}
...
$criteria->andWhere(Criteria::expr()->orX($orxList));
这会导致异常:
没有赋予CompositeExpression的表达式。
我如何将这样的Criteria与最初的where
子句结合起来?
答案 0 :(得分:2)
我遇到了类似的问题,并像这样解决了它:
use Doctrine\Common\Collections\Expr\CompositeExpression;
...
/* Gather optional Params */
$orxList = array();
/* Optional Criteria */
if (!empty($champions)) {
foreach ($champions as $c) {
$orxList[] = Criteria::expr()->eq('champion', $c);
}
}
...
$criteria->andWhere(new CompositeExpression(CompositeExpression::TYPE_OR, $orxList));
如您所见,CompositeExpression
的构造函数接受一个表达式数组,这会生成正确的查询。
答案 1 :(得分:1)
您应该使用Expr类中的orX()
,例如:
$orX = $exp->orX();
$index = 0;
foreach ($champions as $c) {
$paramName = ':param_' . $index;
$orX->add($qb->expr()->eq('u.column', $paramName));
$qb->setParameter($paramName, $c);
$index++;
}
但是,如果您的数组只是以相同方式比较普通字符串/对象,请考虑使用WHERE IN []表达式。