Symfony中使用Doctrine实现带NOT IN子查询的SQL查询方法
解决方案
你可以通过Doctrine QueryBuilder的表达式方法嵌套子查询来实现需求,示例代码如下:
// 1. 构建子查询,对应你SQL里的NOT IN括号内逻辑 $subQueryBuilder = $entityManager->createQueryBuilder(); // 实体管理器实例,在Repository中可直接用$this->createQueryBuilder $subQueryBuilder ->select('h.taskId') // 替换为你Hardware实体中对应task_id的属性名 ->from('App\Entity\Task', 'task') // 替换为你项目中Task实体的实际命名空间 ->innerJoin('App\Entity\Hardware', 'h', 'WITH', 'h.taskId = task.id'); // 替换为你Hardware实体的实际命名空间 // 2. 主查询嵌入子查询 $result = $test->createQueryBuilder('t') ->select('t.id') ->where($subQueryBuilder->expr()->notIn('t.id', $subQueryBuilder->getDQL())) ->getQuery() ->getArrayResult();
注意事项
- 所有实体命名空间需要替换为你项目内的实际路径,不能直接照搬示例
- Doctrine查询用的是实体属性名,不是数据库字段名,如果你的实体属性是驼峰格式要对应修改,不要直接写蛇形的数据库字段
- 如果你在Task实体中已经定义了和Hardware的关联属性,关联部分可以简化为
->innerJoin('task.hardware', 'h'),不需要额外写WITH条件
内容的提问来源于stack exchange,提问作者Stefan DOK
相关产品推荐
相关产品推荐

