【发布时间】: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