如何与教条和标准相结合

问题描述 投票:1回答:2

我想用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的表达式。

我如何将这样的标准与最初的where条款结合起来?

php symfony doctrine criteria
2个回答
2
投票

你应该使用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 []表达式。


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的构造函数接受一个表达式数组,这会生成正确的查询。

© www.soinside.com 2019 - 2024. All rights reserved.