【问题标题】:DQL and MAX function call as a CONCAT argumentDQL 和 MAX 函数调用作为 CONCAT 参数
【发布时间】:2018-04-20 13:13:35
【问题描述】:

我有一个包含以下说明的存储库函数:

$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 |字符串 |输入参数 |函数返回字符串 | AggregateExpression,得到 'MAX'

用以下 sn-p 完全替换 addSelect 调用也不起作用,并引发相同的错误:

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

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

Doctrine DBAL v2.6.3 ;教义 ORM v2.6.1

【问题讨论】:

    标签: doctrine-orm dql doctrine-query


    【解决方案1】:

    我也遇到过同样的问题,我认为这是 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

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多