2012-04-14 158 views
5

我有我的兩個類UserRole,我需要編寫一個QueryBuilder,它爲具有ROLE_PROVIDER角色的用戶返回一個查詢。我需要這在Symfony的2實體表單字段在窗體類定義我對所提場下面的代碼片段:Symfony 2中的Doctrine 2 - 通過關聯過濾QueryBuilder

$builder->add('provider', 'entity', array(
    'class' => 'ElCuadreAccountBundle:User', 
    'property' => 'username', 
    'query_builder' => function(UserRepository $ur) { 
         return $ur->getUsersByRoleQB('ROLE_PROVIDER'); 
         }, 
    'required' => true, 
)); 

然後在我的自定義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不支持通過關聯本機過濾。在this page他們這樣說,並建議使用DQL進行這種過濾。我的問題是,我還沒有找到如何從DQL句子中創建一個QueryBuilder對象。如果您還可以爲我提供正確的DQL查詢,我將不勝感激...

感謝您的幫助!

回答

11

哪裏應該真正做你想做的。你只要有語法錯誤的,「在」:

->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的工作。未經測試。

+0

謝謝!真正完整的答案......有一個問題,它與原始問題沒有太大的關係,但是在這裏我去了......我已經多次閱讀過symfony 2和doctrine 2的新版本即將到來,而且人們似乎已經瞭解了新功能,但我已經厭倦了運行'php bin/vendors install',它不會升級symfony或教義......我該如何升級?或者什麼時候這些新版本將成爲官方?感謝您的回答!!! – Throoze 2012-04-14 23:39:43

+0

你可以在這裏閱讀關於D2.2的信息:http://www.doctrine-project.org/。在S2.1發佈之前,S2將不會有D2.2集成,可能在今年夏天。但是,您可以直接安裝D2.2,在autoload.php中調整路徑,並且大部分您的教義代碼應該可以工作。查看文檔以瞭解要注意的事項。 – Cerad 2012-04-14 23:47:57

+0

感謝您的回答! – Throoze 2012-04-15 08:06:36

3

更簡單還是可以這樣做:

->where('r.role IN (:role)') 
->setParameter('role', $role); 

我覺得這遠遠超過加入更清晰的$ QB-> EXPR()...