我想选择未提供给QueryBuilder#select(...)
的实体。在RAW 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行,col -1接近'select x from':错误:无法通过识别变量选择实体而不选择一个根实体别名。
如何与学说的QueryQuilder一起使用?
不幸的是,学说不可能(请参阅Github上的本杰明·埃伯利(Benjamin Eberlei)的说法)。
解决方案/ workaround 是在从 Xxx
到 Aaa
的方向上定义整个关联链,然后遵循"路径"启动 FROM
CC_6 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()
;