首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理论查询“哪里notIn”子查询问题

理论查询“哪里notIn”子查询问题
EN

Stack Overflow用户
提问于 2013-10-11 12:15:35
回答 1查看 2K关注 0票数 2

在Symfony2中,我有很多:用户和角色之间的许多关系。我正在尝试获取所有未链接到ROLE_SUPER_ADMIN角色的用户的列表。

在迁移到Symfony2 2/ doctrine之前,我通过一个简单的NOT IN sql查询实现了这一点,但在我的一生中,我无法实现与原则相同的效果。

以下是我所尝试的:

代码语言:javascript
复制
$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
$qb2 = $qb;

$dql = $qb->select('sa.id')
          ->from('AcmeAdminBundle:User', 'sa')
          ->leftJoin('sa.roles', 'r')
          ->andWhere('r.role = :role')
          ->getDQL();

$result = $qb2->select('u')
              ->from('AcmeAdminBundle:User', 'u')
              ->where($qb2->expr()->notIn('u.id', $dql))
              ->setParameter('role', 'ROLE_SUPER_ADMIN')

$users = $result->getQuery()->getResult();

但这是一个错误:

代码语言:javascript
复制
[Semantical Error] line 0, col 140 near 'sa LEFT JOIN': 
Error: 'sa' is already defined.

这是输出:

代码语言:javascript
复制
SELECT u 
FROM AcmeAdminBundle:User sa 
LEFT JOIN sa.roles r, AcmeAdminBundle:User u 
WHERE u.id NOT IN (
                   SELECT sa.id 
                   FROM AcmeAdminBundle:User sa 
                   LEFT JOIN sa.roles r 
                   WHERE r.role = :role
                  )

我不知道它为什么要输出这样的结果,因为它不应该执行两次LEFT JOIN,我怀疑它与有两个QueryBuilder实例有关,但可能是完全不同的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-11 12:31:33

您需要MEMBER OF,或者在您的情况下需要NOT MEMBER OF选项。

代码语言:javascript
复制
$qb->select('sa.id')
   ->from('AcmeAdminBundle:User', 'sa')
   ->where(":Role NOT MEMBER OF sa.roles")
   ->setParameter("Role", <<ROLE_ID_OR_ROLE_ENTITY>>);

我没有测试这段代码,但它应该会给你一些想法。

完整的文档可以在http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html上找到

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19317921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档