Как написать этот запрос в построителе запросов?

У меня есть следующий (примерный) запрос:

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);

Помощь очень ценится!


person sprain    schedule 17.01.2013    source источник


Ответы (3)


Во-первых, WHERE section_id is null не имеет особого смысла,
откуда берётся section_id?
Если от section_user, то не может быть 3 и null одновременно.. ;)
Если от User, то это отношение один ко многим, а не многие ко многим...

Возможно, немного разъяснений о том, чего вы пытаетесь достичь.

В основном это работает так: (слева 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);
person Gintro    schedule 17.01.2013
comment
Извините, это не то, что я ищу. Это левое соединение. Поэтому значение будет NULL, если оно не равно 3. - person sprain; 18.01.2013

Я думаю, что это та же ситуация, что и в здесь Но я вижу, что вам требуется 2 условия в операторе leftJoin, попробуйте это (я предполагая, что идентификационный ключ в обеих сущностях равен 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

person Broncha    schedule 18.01.2013
comment
Я попробую это, как только вернусь в соответствующий проект. Просто в качестве примечания: мой пример запроса имеет смысл, поскольку я тщательно его протестировал, и он действительно возвращает правильные данные. Это ЛЕВОЕ СОЕДИНЕНИЕ. Таким образом, каждый пользователь, не соответствующий разделу с идентификатором 3, будет иметь section_id равным NULL. И это именно те, кого я ищу. - person sprain; 21.01.2013
comment
Ну, я не уверен... вы присоединяетесь к su.section_id = 3 и просто возвращаете строки, где section_id is null - person Broncha; 21.01.2013

person    schedule
comment
Это приводит к User has no association named section_user, что кажется мне логической ошибкой. - person sprain; 18.01.2013
comment
Отображение Doctrine 2 использует нотацию верблюжьего регистра, поэтому используйте u.sectionUser (посмотрите правильное имя поля в вашей сущности) - person Adamamont; 20.01.2013