如何使用Doctrine的QueryQuilder通过另一种实体类型选择实体?



我想选择未提供给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 是在从 XxxAaa的方向上定义整个关联链,然后遵循"路径"启动 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()
;

相关内容

  • 没有找到相关文章

最新更新