【问题标题】:Symfony3.4 / Doctrine : subquery in FROM Clause : Error: Class 'SELECT' is not definedSymfony3.4 / Doctrine:FROM 子句中的子查询:错误:未定义“SELECT”类
【发布时间】:2019-01-11 15:30:27
【问题描述】:

我正在开发一个 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 查询的解决方案吗?

【问题讨论】:

  • 很确定您仍然需要内部选择周围的括号。可能还有其他问题。当然,内联 $clientId 是一件坏事。
  • 在这种情况下,学说将“SELECT”理解为实体类。我几乎可以肯定用括号括起来的子查询可以解决这个问题。

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


【解决方案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"] 访问总和

【讨论】:

    【解决方案2】:

    引用 Christophe stoef Coevoet(Symfony 核心开发人员)的话:

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

    在您的情况下,最好的解决方案可能是运行 SQL 查询 (因为你得到一个标量,所以无论如何你都不需要 ORM 水合)

    详情here

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2019-09-15
      相关资源
      最近更新 更多