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
)
2回実行するべきではないので、なぜそのように出力されるのかLEFT JOIN
わかりません.2つのQueryBuilderインスタンスを持つことと関係があると思われますが、まったく別のものである可能性があります.