DQL和MAX函数调用为CONCAT参数

时间:2018-04-20 13:13:35

标签: doctrine-orm dql doctrine-query

我有一个存储库函数,其中包含以下指令:

$QB = $this->_em->createQueryBuilder();
$QB ->addSelect("CONCAT(dsub2.dagId, MAX(tsub2.executionDate))")
    ->from(TaskInstance::class, 'tsub2')
    ->join('tsub2.dag', 'dsub2')
    ->addGroupBy('dsub2.dagId')
    ;

致电$QB->getQuery()->getSQL();$QB->getQuery()->getResult()会引发错误说:

  

预期的StateFieldPathExpression |字符串| InputParameter | FunctionsReturningStrings | AggregateExpression,得到'MAX'

使用以下代码段完全替换addSelect调用也不起作用,并引发相同的错误:

->addSelect(
    $QB->expr()->concat(
        'dsub2.dagId'
        , $QB->expr()->max('tsub2.executionDate')
    )
)

您是否知道将MAX函数调用嵌套为CONCAT参数的正确方法(或解决方法)?

Doctrine DBAL v2.6.3; Doctrine ORM v2.6.1

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我认为它是v2.6.1上的一个Doctrine Bug。 我发现的技巧更像是一种解决方法而不是真正的解决方案:

你必须改变

$QB->addSelect("CONCAT(dsub2.dagId, MAX(tsub2.executionDate))")

通过

$QB->addSelect("CONCAT(dsub2.dagId, IF(true=true, MAX(tsub2.executionDate), ''))")

通过插入IF(包括MAX),Doctrine不会"看到" MAX。

但是......在IF中你需要一个条件而且Doctrine不喜欢IF(true, 1, 0),所以另一个技巧就是if条件:true=true