2014-04-07 80 views
0

這讓我瘋狂。查詢ManyToMany關係Doctrine2

我有一個正常的Symfony2安全系統,用戶和角色實體之間有ManyToMany關係。

假設我在數據庫中有3個角色,ROLE_1ROLE_2ROLE_3

如何檢索所有沒有ROLE_3的用戶?

我已經嘗試過類似:

$qb->innerJoin('u.roles', 'r , 'WITH', $qb->expr()->notIn('r.id', ':roles'))) 
       ->setParameter('roles', array(3)); 

我的問題是,我怎麼可以查詢JoinTable?

+0

試試這個DQL:'SELECT u FROM MyBundle:User u JOIN u.roles r WHERE r NOT IN(:roles)' –

+0

保持以ROLE_3返回一個用戶。事情是:用戶1(ROLE_1,ROLE_3)用戶2(ROLE_1)用戶3(ROLE_1)。我想獲得沒有ROLE_3的用戶,所以在這種情況下,只能返回User2和User3。 –

回答

0

這更像是一個SQL問題,而不是Symfony或Doctrine問題。想到的第一個解決方案是子查詢,儘管這可能是也可能不是解決這個問題的最有效方法。事情是這樣的:

SELECT username 
FROM users 
WHERE users.id NOT IN (
    SELECT users.id 
    FROM users 
    INNER JOIN user_roles 
    ON users.id = user_roles.user_id 
    INNER JOIN roles 
    ON user_roles.role_id = roles.id 
    WHERE roles.id NOT IN (1,2) 
); 

其中1和2是要在結果中包含的角色的ID和user_roles是用戶和角色之間的橋樑表。