我正在开发一个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查询有解决方案吗?
答案 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”]访问总和。