Symfony框架下SQL转DQL时出现ON语法错误如何解决
错误原因
- DQL 不存在
ON关键字,通过实体关联属性做关联查询时,Doctrine 会自动根据实体类中配置的关联映射(如@JoinColumn、@ManyToMany等注解)生成关联条件,不需要手动写关联逻辑。如果需要手动指定额外的关联筛选条件,要使用WITH关键字而非ON,多余的ON是本次语法报错的直接原因。 - SELECT 语句缺失 Palettes 实体本身的返回字段,不符合原 SQL 取所有调色板字段的需求。
- GROUP BY 字段配置错误,原 SQL 按调色板ID分组,对应 DQL 应当按
p.id分组。 - ORDER BY 字段配置错误,原 SQL 按统计出的文件数倒序排序,而非按文件名称排序。
- 拼接 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
相关产品推荐
相关产品推荐

