2

Symfony2 では、ユーザーとロールの間に多対多の関係があります。ROLE_SUPER_ADMINロールにリンクされていないすべてのユーザーのリストを取得しようとしています。

Symfony2/Doctrine に移行する前は、単純なNOT INsql クエリでこれを達成していましたが、私の人生では、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インスタンスを持つことと関係があると思われますが、まったく別のものである可能性があります.

4

1 に答える 1

5

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にあります。

于 2013-10-11T12:31:33.550 に答える