В Doctrine ORM есть два способа справиться с этим. Наиболее типичным является использование условия IN
с подзапросом:
SELECT
p
FROM
SitePage p
WHERE
p.id IN(
SELECT
p2.id
FROM
SiteVersion v
JOIN
v.pages p2
WHERE
v.id = :versionId
AND
p.slug = :slug
)
. Другой способ заключается в дополнительном соединении с функцией произвольного соединения, введенной в версии 2.3 ORM :
SELECT
p
FROM
SitePage p
JOIN
SiteVersion v
WITH
1 = 1
JOIN
v.pages p2
WHERE
p.id = p2.id
AND
v.id = :versionId
AND
p2.slug = :slug
1 = 1
происходит только из-за ограничения тока синтаксического анализатора.
Обратите внимание, что ограничение, которое вызывает семантическую ошибку заключается в том, что процесс гидратации начинается с корня выбранных объектов. Без корень на месте гидратор не имеет никакого отношения к тому, как свернуть с помощью fetch-join или объединить результаты.