symfony 原则查询“where notIn”子查询问题

jfgube3f  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(106)

在Symfony 2中,我在用户和角色之间有一个多对多的关系。我试图得到一个没有链接到ROLE_SUPER_ADMIN角色的所有用户的列表。
在迁移到Symfony 2/Doctrine之前,我已经通过一个简单的NOT IN sql查询实现了这一点,但在我的一生中,我无法通过doctrine实现同样的效果。
以下是我正在尝试的:

$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();

但这是错误的:

[Semantical Error] line 0, col 140 near 'sa LEFT JOIN': 
Error: 'sa' is already defined.

这是输出:

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示例有关,但可能完全是另一回事。

kq0g1dla

kq0g1dla1#

您需要MEMBER OFNOT MEMBER OF选项。

$qb->select('sa.id')
   ->from('AcmeAdminBundle:User', 'sa')
   ->where(":Role NOT MEMBER OF sa.roles")
   ->setParameter("Role", <<ROLE_ID_OR_ROLE_ENTITY>>);

我没有测试这段代码,但它应该给予你一些想法。
完整文档可在https://www.doctrine-project.org/projects/doctrine-orm/en/2.14/reference/dql-doctrine-query-language.html上找到

相关问题