У меня есть две сущности (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 кажется, что никакая таблица соединений не используется. Почему?




Вам не нужно указывать 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 и вашим. Спасибо!