gpt4 book ai didi

php - Doctrine 查询 "where notIn"子查询问题

转载 作者:行者123 更新时间:2023-12-02 04:48:32 26 4
gpt4 key购买 nike

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

在迁移到 Symfony2/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 实例有关,但也可能完全不同.

最佳答案

您需要 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 找到

关于php - Doctrine 查询 "where notIn"子查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19317921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com