Symfony3.4 / Doctrine:FROM子句中的子查询:错误:未定义类“ SELECT”

时间:2018-08-03 17:44:05

标签: symfony doctrine-orm subquery symfony-3.4 doctrine-query

我正在开发一个Symfony 3.4项目,并且试图将sql查询转换为DQL查询,但是遇到问题。

Mysql查询:

select sum(montant_paye) 
from 
    (select montant_paye 
     from vente 
     where client_id = 1
     and montant_paye > 0
     order by date ASC 
     limit 2) 
     as T;

DQL查询(错误):

return $this->getEntityManager()
  ->createQuery('
      SELECT SUM(montantPaye) as Total
      FROM
        SELECT v.montantPaye
        FROM AppBundle:Vente v
        where v.montantPaye > 0
        AND v.client = '.$clientId.'
        ORDER BY v.date ASC
        limit 2
  ')
  ->getResult();

错误:

[Semantical Error] line 0, col 71 near 'SELECT v.montantPaye
': Error: Class 'SELECT' is not defined.

有人对正确的DQL查询有解决方案吗?

2 个答案:

答案 0 :(得分:1)

来自Christophe stoef Coevoet(Symfony核心开发人员)的报价:

  

DQL与查询对象有关。在FROM子句中支持子选择意味着DQL解析器不再能够构建结果集映射(因为子查询返回的字段可能不再与对象匹配)。   这就是为什么它不被支持的原因(仅当您在没有水合的情况下运行查询的情况下才支持它是不可行的IMO,因为这意味着查询解析需要依赖于执行模式)。

     

对于您来说,最好的解决方案可能是运行SQL查询   (当您获得标量时,无论如何您都不需要ORM水化)

详细信息here

答案 1 :(得分:1)

将此功能添加到您的VenteRepository:

public function sumMontantPaye($clientId)
{
    return $this->createQueryBuilder("v")
        ->select("sum(v.montantPaye) as sum")
        ->where("v.client = :id")
        ->andWhere("v.montantPaye > 0")
        ->setParameter("id", $clientId)
        ->setMaxResults(2)
        ->getQuery()->getSingleResult();
}

假设$ result是控制器中分配给该功能的变量,则可以使用$ result [“ sum”]访问总和。