如何用DQL获取未关联数据?当前查询仅返回含评论的帖子
解决DQL仅返回带评论帖子的问题
看起来你的问题出在聚合函数缺少分组逻辑以及关联条件的细节上,我来帮你修正这段代码:
问题根源分析
- 你使用了
COUNT(co)和MAX(co.date)这类聚合函数,但没有添加GROUP BY子句——这会导致ORM把所有结果合并成一行,自然只会保留有评论的帖子(无评论的会被聚合逻辑忽略); - 你的LEFT JOIN条件
co.idPublication=p写法有误,应该关联帖子的主键(比如p.id),而不是直接用对象p进行比较; - 如果实体间已经定义了关联关系,DQL的LEFT JOIN可以写得更简洁,不需要手动指定WITH条件。
修正后的完整代码
public function getAllPostsDQL() { $q = $this->getEntityManager()->createQuery(' SELECT p.type, p.date, p.urlImage, p.nom, u.nom as nomU, u.prenom as prenomU, COUNT(co.id) as nb, COALESCE(MAX(co.date), NULL) as maxDate FROM PidevBundle:Publication p LEFT JOIN p.commentaires co -- 假设你的Publication实体已定义commentaires关联属性 JOIN p.idUser u GROUP BY p.id, p.type, p.date, p.urlImage, p.nom, u.nom, u.prenom '); return $q->getResult(); }
关键修改点说明
- 简化LEFT JOIN:如果
Publication实体和Commentaire实体已经定义了双向关联(比如$commentaires属性),直接用LEFT JOIN p.commentaires co即可,ORM会自动处理关联逻辑;如果没定义关联,就改用LEFT JOIN PidevBundle:Commentaire co WITH co.idPublication = p.id; - 添加GROUP BY子句:必须按所有非聚合字段分组(帖子的选中字段、用户的字段),这样每个帖子会单独返回一行,无论是否有评论;
- 更精准的统计逻辑:用
COUNT(co.id)替代COUNT(co),明确只统计存在评论ID的情况(无评论时会返回0); - 处理空值场景:用
COALESCE包裹MAX(co.date),当帖子没有评论时可以返回NULL(或你指定的默认日期,按需调整)。
效果验证
修正后,没有评论的帖子会被正常返回,nb字段值为0,maxDate为NULL(或你设置的默认值);带评论的帖子则会正确统计评论数量和最新评论日期。
内容的提问来源于stack exchange,提问作者Bahri Mohamed Aziz
相关产品推荐
相关产品推荐

