Symfony 4, Doctrine Innerjoin не использует распределительную таблицу - PullRequest
0 голосов
/ 21 ноября 2018

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

1 Ответ

0 голосов
/ 21 ноября 2018

Вам не нужно указывать 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')

...