2014-04-07 2 views
0

이것은 나를 미치게합니다.ManyToMany의 쿼리 관계 Doctrine2

나는 일반 Symfony2 보안 시스템을 가지고 있는데, 그들 사이의 ManyToMany 관계가있는 사용자 및 역할 엔티티가 있습니다.

내가 데이터베이스에 ROLE_1, ROLE_2ROLE_3의 세 가지 역할을 가지고 있다고 가정 해 봅시다.

예를 들어 ROLE_3이없는 모든 사용자를 검색하려면 어떻게해야합니까?

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

내 질문은, 내가 어떻게이 관절 식으로 조회 할 수 있습니다

은 이미 뭔가를 시도?

+0

이 DQL을 시도해보십시오 :'SELECT u FROM MyBundle : 사용자 u u.roles r u가 아닌 곳 (: 역할)' –

+0

ROLE_3을 가진 사용자를 계속 반환합니다. 것은 : User1 (ROLE_1, ROLE_3) User2 (ROLE_1) User3 (ROLE_1). ROLE_3없이 User를 얻으려는 경우이 경우 User2와 User3 만 반환해야합니다. –

답변

0

이것은 Symfony 또는 Doctrine 질문보다 SQL 질문에 더 가깝습니다. 가장 먼저 떠오르는 해결책은이 문제를 처리하는 가장 효율적인 방법 일 수도 있고 아닐 수도있는 하위 쿼리입니다. 이런 식으로 뭔가 :

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는 사용자와 역할 사이의 브리지 테이블입니다.