Как выбрать сущности через другой тип сущности, используя 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 сущность, идущая по "пути", начиная FROMXxx:

$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()
;
Другие вопросы по тегам