[英]Doctrine 2 in Symfony 2 - Filtering a QueryBuilder by an association
我有兩個類User
和Role
,我需要創建一個QueryBuilder
,它為具有ROLE_PROVIDER
角色的用戶返回一個查詢。 我需要這個在Symfony 2中的實體表單字段。在表單類定義中,我有上面提到的字段的以下片段:
$builder->add('provider', 'entity', array(
'class' => 'ElCuadreAccountBundle:User',
'property' => 'username',
'query_builder' => function(UserRepository $ur) {
return $ur->getUsersByRoleQB('ROLE_PROVIDER');
},
'required' => true,
));
然后在我的Custom UserRepository
我有以下函數,它應該返回一個QueryBuilder
對象:
public function getUsersByRoleQB($role) {
$qb = $this->createQueryBuilder('u');
return $qb->join('u.roles','r')
->where($qb->expr()->in('r.role',$qb->expr()->literal($role)))
->orderBy('u.username', 'ASC');
}
當然這不起作用,但我粘貼它來說明我的需求。
我一直在環顧四周,似乎Doctrine2不支持通過關聯進行原生過濾。 在這個頁面中他們這么說,並建議使用DQL
進行這種過濾。 我的問題是我還沒有找到如何從DQL
語句中創建QueryBuilder
對象。 如果您也可以為我提供正確的DQL
查詢,我將非常感激......
謝謝你的幫助!
哪里應該實際做你想要的。 您只需要'in'的語法錯誤:
這個
->where($qb->expr()->in('r.role',$qb->expr()->literal($role)))
應該
->where($qb->expr()->in('r.role',$role))
我知道它看起來有點奇怪但是由於預處理語句不直接支持數組,因此IN子句的參數總是必須單獨轉義(這個學說適合你)。 因此,對於需要文字的eq表達式,語法有點不同。
你提出了一個很好的問題,因為我需要按關聯過濾。 我認為D2.2將允許開箱即用。 我沒有真正嘗試過,但我懷疑
$dql = 'a,b FROM whatever...'; // Don't start with SELECT
$qb->select($dql);
return $qb;
只要您將實際的'SELECT'字符串保留在$ dql之外,它實際上可以在不指定任何其他部分的情況下工作。 未經測試。
你甚至可以做得更簡單:
->where('r.role IN (:role)' )
->setParameter( 'role', $role );
我發現這比添加$ qb-> expr()更容易辨認......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.