如何与教条和标准相结合

时间:2018-04-28 07:18:50

标签: php symfony doctrine criteria

我想用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子句结合起来?

2 个答案:

答案 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 []表达式。