Запрос Doctrine 2 с несколькими соединениями

Я застрял с вопросом, и я надеюсь, что кто-то здесь может помочь с моим кодом.

Мои классы выглядят так:

Лицо 1 ------- 1..* Участие 1...* -------- 1 Мероприятие

Теперь у меня есть атрибут класса Event под названием «isActive», а в классе Person у меня есть атрибут «isChecked».

С помощью моего запроса я хочу вернуть всех лиц «isChecked», которые не участвуют в событии «isActive».

Пока это мой запрос, но он не возвращает то, что мне нужно:

$query = $em->createQueryBuilder('c')
        ->select('p')
        ->from('AppBundle:Person', 'p')
        ->andWhere('p.isChecked = true')
        ->leftJoin('p.participation', 'pa')
        ->andWhere('pa IS NULL')
        ->leftJoin('pa.event', 'e')
        ->andWhere('e.isActive = true');

Если кто-нибудь может сказать мне, что я делаю неправильно здесь, было бы здорово.

С уважением, Себастьян


person Sebastian271    schedule 12.06.2018    source источник


Ответы (1)


Вам нужно настроить часть соединения, используя предложение WITH, удалить ->andWhere('e.isActive = true') из фильтра where и переместить это предложение в часть соединения ваших сущностей, чтобы возвращались только события (строки соединяются с помощью pa), которые помечены как isActive.

DQL

SELECT p
FROM AppBundle:Person p
LEFT JOIN p.participation pa
LEFT JOIN pa.event e WITH e.isActive = true
WHERE p.isChecked = true
AND pa IS NULL

В построителе запросов вы можете представить его как

$query = $em->createQueryBuilder('c')
        ->select('p')
        ->from('AppBundle:Person', 'p')
        ->leftJoin('p.participation', 'pa')
        ->leftJoin('pa.event', 'e','WITH', 'e.isActive = true')
        ->andWhere('p.isChecked = true')
        ->andWhere('pa IS NULL');
person M Khalid Junaid    schedule 12.06.2018
comment
Большое спасибо, сэр! :-) ./лук - person Sebastian271; 12.06.2018