Как выбрать сущности через другой тип сущности, используя QueryQuilder от Doctrine?
Я хочу выбрать объекты, которые не предоставляются QueryBuilder#select(...)
, В сыром SQL это будет выглядеть так:
SELECT x.*
FROM aaa a
INNER JOIN bbb b ON a.document_id = b.id
INNER JOIN ccc c ON b.client_user_id = c.id
INNER JOIN xxx x ON c.client_id = x.id
WHERE a.id = 123
Теперь я попытался реализовать эту логику с QueryBuilder
:
$query = $queryBuilder->select('x')
->from(Aaa::class, 'a')
->join('a.bbb', 'b')
->join('b.ccc', 'c')
->join('c.xxx', 'x')
->where('a.id = :aId')
->setParameter('aId', $aId)
->getQuery()
;
Но это не работает:
[Семантическая ошибка] строка 0, столбец -1 рядом с "SELECT x FROM": Ошибка: невозможно выбрать объект с помощью переменных идентификации без выбора хотя бы одного псевдонима корневого объекта.
Как заставить это работать с QueryQuilder Doctrine?
1 ответ
К сожалению, это невозможно с Doctrine (см. Заявление Бенджамина Эберлей к этому вопросу на GitHub).
Решение / обходной путь состоит в том, чтобы определить всю цепочку ассоциаций в направлении от Xxx
в Aaa
а затем найти Xxx
сущность, идущая по "пути", начиная FROM
Xxx
:
$query = $queryBuilder->select('x')
->from(Xxx::class, 'x')
->join('x.ccc', 'c')
->join('c.bbb', 'b')
->join('b.aaa', 'a')
->where('a.id = :aId')
->setParameter('aId', $aId)
->getQuery()
;