2012-04-14 6 views
5

두 클래스가 UserRole인데 ROLE_PROVIDER 역할을 가진 사용자에 대한 쿼리를 반환하는 QueryBuilder을 만들어야합니다. 나는 다음과 같은 언급 필드에 대한 조각이 폼 클래스 정의에서 심포니 2의 엔티티 양식 필드이 필요합니다 단골 UserRepository에서 다음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, 
)); 

과 내가 가지고 반환해야 다음 함수, 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을 사용하여 필터링하는 것이 좋습니다. 내 문제는 문장에서 QueryBuilder 개체를 만드는 방법을 찾지 못했다는 것입니다. 오른쪽 DQL 쿼리를 제공 할 수 있다면 매우 감사 할 것입니다 ...

도움을 주셔서 감사합니다!

답변

11

어디 실제로 원하는대로해야합니다. ,

->where($qb->expr()->in('r.role',$qb->expr()->literal($role))) 

내가 그것을 직접 배열을 지원하지 않는 이상한하지만 준비된 문 때문에 조금 보일 수 있습니다 알고

->where($qb->expr()->in('r.role',$role)) 

해야합니다 당신은 '에서'잘못된 구문이 IN 절에 대한 매개 변수는 항상 개별적으로 이스케이프 처리해야합니다 (doctrine이 사용자를 대신합니다). 따라서 문법은 리터럴이 필요한 eq 표현식에 대해 조금 다르다.

연결별로 필터링해야하므로 좋은 질문이 제기됩니다. 나는 D2.2가 이것을 밖으로 허용 할 것이라고 생각한다. 난 정말 그것을 시도하지 않은하지만 난

$dql = 'a,b FROM whatever...'; // Don't start with SELECT 
$qb->select($dql); 
return $qb; 

실제로 $의 DQL에서 당신의 휴가만큼 실제 'SELECT'문자열을 다른 부품을 지정하지 않고 작동 할 것이라고 생각한다. 테스트되지 않았습니다.

+0

감사합니다! 정말 완전한 대답입니다. 한 가지 질문입니다. 원래 질문과 관련이 없지만, 여기에 있습니다 ... 나는 여러 번 symfony 2와 doctrine 2의 새로운 버전이 나오고 사람들이 새로운 기능을 제공하지만,'php bin/vendors install'을 실행하는 것에 지쳐 있고 symfony 나 교리를 업그레이드하지 않습니다 ... 어떻게 업그레이드 할 수 있습니까? 또는 그 새로운 버전이 공식적 일 것 인 때? 당신의 대답에 감사드립니다 !!! – Throoze

+0

D2.2에 대한 내용은 http://www.doctrine-project.org/에서 확인할 수 있습니다. S2는 D2.1이 S2.1이 출시 될 때까지 통합 될 예정이며 이번 여름에 출시 될 예정입니다. 그러나 D2.2를 직접 설치하고 autoload.php에서 경로를 조정할 수 있으며, 대부분의 경우 교리 코드가 작동해야합니다. 조심해야 할 점을 문서에서 확인하십시오. – Cerad

+0

답변 해 주셔서 감사합니다. – Throoze

3

더 간단 여전히 당신은 할 수 있습니다 :

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

나는이 훨씬 더 명료 추가하는 것보다 찾아 $ qb-> EXPR() ...