Symfony 4, Doctrine Innerjoin не использует соединительную таблицу

У меня есть две сущности (entity1 и entity2) в отношении ManyToMany. Все таблицы работают нормально, если мне просто нужен объект из одной сущности. Поля в объектах помечены как ManyToMany, включая атрибуты mappedBy и reversedBy. Теперь мне нужно подмножество из entity1 на основе предложения where в entity2.

В SQL все просто.

select
a.field1,a.field2
from entity1 as a
left join entity1_entity2 as b on a.entity1_id=b.foreignKey1
left join entity2 as c on b.foreignKey2=c.entity2_id
where c.whereField = 'value'
and a.whereField = 'anotherValue'

Я хочу использовать репозиторий из entity1 и попробовал запрос createQueryBuilder.

$query = $this->createQueryBuilder('e1')
    ->distinct(true)
    ->innerJoin(Entity2::class, 'e2')
    ->where("e2.whereField2= :whereE2")
    ->andWhere('e1.whereField1= :whereE1')
    ->setParameter("whereE2", $whereE2)
    ->setParameter("whereE1", $whereE1);

Результат выглядит как полное внешнее соединение. Дамп DQL / SQL кажется, что никакая таблица соединений не используется. Почему?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не нужно указывать Entity в предложении innerJoin. Doctrine может делать это сама и также использовать таблицу соединений.

Например, entity1 как аннотация ManyToMany к свойству secondEntities.

QueryBuilder может выглядеть так:

$query = $this->createQueryBuilder('e1')
    ->distinct(true)
    ->innerJoin('e1.secondEntities', 'e2')
    ->andWhere('e1.whereField1= :whereE1') // You can add additionnal conditions ;)
    ->setParameter("whereE1", $whereE1)
;

Примечание: вы можете использовать условие соединения ON, например: ->innerJoin('e1.secondEntities', 'e2', Join::WITH, 'CONDITION HERE')

- старый комментарий удален - Теперь я вижу и понимаю разницу между моим DQL и вашим. Спасибо!

ulfilas 21.11.2018 14:09

Если это помогло вам решить вашу проблему. Не забудьте пометить этот ответ как «отвеченный» для использования в будущем;)

G1.3 21.11.2018 14:17

Другие вопросы по теме