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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:24:00