You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony框架下SQL转DQL时出现ON语法错误如何解决

错误原因
  1. DQL 不存在ON关键字,通过实体关联属性做关联查询时,Doctrine 会自动根据实体类中配置的关联映射(如@JoinColumn、@ManyToMany等注解)生成关联条件,不需要手动写关联逻辑。如果需要手动指定额外的关联筛选条件,要使用WITH关键字而非ON,多余的ON是本次语法报错的直接原因。
  2. SELECT 语句缺失 Palettes 实体本身的返回字段,不符合原 SQL 取所有调色板字段的需求。
  3. GROUP BY 字段配置错误,原 SQL 按调色板ID分组,对应 DQL 应当按p.id分组。
  4. ORDER BY 字段配置错误,原 SQL 按统计出的文件数倒序排序,而非按文件名称排序。
  5. 拼接 DQL 语句时未将排序逻辑拼入最终查询字符串,排序规则不生效。
正确实现方案

如果你的Palettes实体类中已经配置了和Files实体的关联属性(如$files属性标注了@OneToMany/@ManyToMany关联),可直接使用以下代码:

public function findSaveByPagesByFilters()
{
    $entityManager = $this->getEntityManager();

    $dqlQuery = "SELECT p, COUNT(f.id) AS nb_files
                 FROM App\Entity\Palettes p
                 JOIN p.files f
                 GROUP BY p.id
                 ORDER BY nb_files DESC";

    $query = $entityManager->createQuery($dqlQuery);
    return $query->getResult();
}

如果未配置实体关联,需要手动指定关联条件,可调整为以下写法:

public function findSaveByPagesByFilters()
{
    $entityManager = $this->getEntityManager();

    $dqlQuery = "SELECT p, COUNT(f.id) AS nb_files
                 FROM App\Entity\Palettes p
                 JOIN App\Entity\Files f WITH p.id = f.palettes
                 GROUP BY p.id
                 ORDER BY nb_files DESC";

    $query = $entityManager->createQuery($dqlQuery);
    return $query->getResult();
}

内容的提问来源于stack exchange,提问作者bjd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:06:01