【问题标题】:How to combine andWhere and orWhere with Doctrines Criteria如何与 Doctrines Criteria 和 Where 和 or Where 结合
【发布时间】:2018-10-08 23:33:39
【问题描述】:

我想用 Doctrine Criteria 创建一个相当复杂和灵活的查询。我有一个andWhere,它包含在每个查询中,但是(取决于输入)我想用orWhere 添加一些可选参数。

$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 子句结合起来?

【问题讨论】:

  • 我发现这很好,但是如果orWhere 是可选的并且查询需要“扩展”,我需要创建一个类似$sql .= 'OR champion = ? 的字符串查询。这似乎不对?

标签: php symfony doctrine criteria


【解决方案1】:

我遇到了类似的问题并这样解决:

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

【讨论】:

    【解决方案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 [] 表达式。

    【讨论】:

    • 这看起来很有希望,但我似乎找不到合适的 Expr() 类?
    • 哦,我的意思是从 querybuilder 返回的那个,类似于 $queryBuilder->expr()->orX()。如果您不使用 querybuilder,我认为您可以创建此类的实例:doctrine-project.org/api/orm/2.6/Doctrine/ORM/Query/Expr.html 出于某种原因,它在 Criteria::expr() 中不可用。
    • @PrimuS,在命名空间方面使用其中之一:使用 Doctrine\ORM\Query\Expr\Andx;使用 Doctrine\ORM\Query\Expr\Orx;
    猜你喜欢
    • 2019-05-12
    • 2013-03-29
    • 1970-01-01
    • 2011-05-07
    • 2017-06-12
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多