SQL转DQL查询指定联系人未浏览文章时报语义错误如何解决
错误原因排查
- 错误提示的根本原因:
contact.viewedArticles是Contact实体下的多对多集合属性,DQL不支持直接对集合属性做IS NULL判断,只能操作单值字段或单值关联字段 - 逻辑错误1:左连接关联contact时没有将「指定联系人ID」的条件放到
WITH子句中,而是放到了WHERE条件里,会导致左连接退化为内连接,无法筛选出未关联的记录 - 逻辑错误2:判断未关联的逻辑不对,不需要判断viewedArticles是否为空,只要左连接后对应关联的contact主键为NULL,就说明该文章没有被指定联系人浏览过
- 原写法硬编码参数,存在SQL注入风险,应该用参数绑定
正确DQL查询写法
以下方法写在ArticleRepository类中,返回结果直接为Article实体对象数组,逻辑和你提供的原生SQL完全对齐:
public function findUnviewedArticlesByContact(int $contactId, bool $isItalian) { return $this->createQueryBuilder('a') ->leftJoin('a.contact', 'c', 'WITH', 'c.id = :contactId') ->andWhere('a.isItalian = :isItalian') ->andWhere('c.id IS NULL') ->setParameter('contactId', $contactId) ->setParameter('isItalian', $isItalian) ->getQuery() ->getResult(); }
内容的提问来源于stack exchange,提问作者Dunkeur
相关产品推荐
相关产品推荐

