1

次の(例示的な)クエリがあります。

SELECT *
FROM User u
LEFT JOIN section_user su ON (su.user_id = u.id AND su.section_id = 3)
WHERE section_id is null

ユーザーとセクション間の多対多の関係でクエリビルダーを使用してSymfony2で再構築しようとしていますが、失敗しています。

私はそれが間違っていることを証明する次のようになると思った:

$er->createQueryBuilder('u')
    ->leftJoin('u.sections', 's', 'WITH', 's = :section')
    ->where('s is null')
    ->setParameter('section', $section);

助けていただければ幸いです。

4

3 に答える 3

0
# Receive Doctrine query builder
$qb = $this->getDoctrine()->getEntityManager()->createQueryBuilder(); 

$qb
   ->select('u')
   ->from('NameBundle:User', 'u')
   ->leftJoin('u.section_user', 'su', \Doctrine\ORM\Query\Expr\Join::WITH, 'su.user_id = u.id AND (su.section_id IS NULL OR su.section_id = :section)'); # Join condition
   ->setParameter('section', $section);
于 2013-01-18T05:37:24.483 に答える
0

まず、WHERE section_id is nullあまり意味が
ありません。section_id はどこから来るのでしょうか?
section_user からのものである場合、3 と null を同時に指定することはできません.. ;)
User からのものである場合、多対多ではなく 1 対多の関係です...

あなたが達成しようとしていることについて少し明確にするかもしれません。

基本的には次のように機能します: (左Doctrine、右Sql)

$er->createQueryBuilder('u')      -> SELECT * FROM user u
   ->leftJoin('u.sections', 'us') -> LEFT JOIN section_user su ON u.id = su.user_id
                                     LEFT JOIN section s ON s.id = su.section_id 
   ->where('us.id = :section')    -> WHERE s.id = :section
   ->setParameter('section', 4);
于 2013-01-17T23:59:40.163 に答える
0

これはここと同じ状況だと思いますが 、leftJoin ステートメントで 2 つの条件が必要であることがわかりました。これを試してください (両方のエンティティの ID キーが であると想定していますid)

$qb->select('u')
 ->from('NameBundle:User','u')
 ->leftJoin('u.sections','su','ON'
    $qb->expr()->andx($qb->expr()->eq('u.id', 'su.user_id'), $qb->expr()->eq('su.id', ':section'))
   )
 ->having('COUNT(su.id) = 0')
 ->groupBy('u.id')
 ->setParameter('section',$section_id);

これにより、ID のセクションにまだ関連付けられていないすべてのユーザーが取得されます$section_id

編集: クエリの例は、常に何も返さないため、意味がないことに気付きました。しかし、あなたが望むのは、セクションに割り当てられていないユーザーだと思います$section_id

于 2013-01-18T16:39:30.477 に答える