2017-03-02 52 views
0

我想選擇沒有提供給QueryBuilder#select(...)的實體。在原始的SQL它應該是這樣的:如何使用Doctrine的QueryQuilder通過另一個實體類型選擇實體?

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() 
; 

但它不工作:

[Semantical Error] line 0, col -1 near 'SELECT x FROM': Error: Cannot select entity through identification variables without choosing at least one root entity alias.

如何與Doctrine的QueryQuilder一起工作?

回答

0

不幸的是,這是不可能與學說(見Benjamin Eberlei陳述在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() 
;