簡體   English   中英

Symfony 2中的Doctrine 2 - 通過關聯過濾QueryBuilder

[英]Doctrine 2 in Symfony 2 - Filtering a QueryBuilder by an association

我有兩個類UserRole ,我需要創建一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM