【问题标题】:Doctrine query "where notIn" subquery issue教义查询“不在哪里”子查询问题
【发布时间】:2013-10-19 12:30:05
【问题描述】:

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

在迁移到 Symfony2/Doctrine 之前,我已经通过一个简单的 NOT IN sql 查询实现了这一点,但对于我来说,我无法通过学说实现同样的效果。

这是我正在尝试的:

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

【问题讨论】:

    标签: php sql symfony doctrine-orm doctrine


    【解决方案1】:

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

    $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找到

    【讨论】:

    • 完美!谢谢@Rene!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2019-07-18
    • 2011-10-28
    • 2012-02-12
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多