2011-11-26 6 views
1

이 코드어떻게 효과적으로

$users = $this->getDoctrine()->getEntityManager() 
      ->createQuery('SELECT tu FROM UserBundle:User tu') 
      ->getResult(); 

$result = array(); 

foreach($users as $user){ 
if($user->hasRole('ROLE_CUSTOMER')) 
    $result[] = $user; 
} 

return $this->render('XBundle:Order:index.html.twig', 
      array('users' => $result)); 

으로 이런 짓을했는지하지만이 같은 결과를 얻을 수있는 간단한 방법은 무엇 Symfony2 + 교리의 역할에 따라 사용자를 나열하려면?

감사합니다.

업데이트, 추가 정보는 :

우리의 주요 문제는 사용자 역할이 계층 구조를 가지고있다.

ROLE_EDITOR에서 ROLE_WRITER를 정의하면 ROLE_EDITOR는 자동으로 ROLE_WRITER를 갖게됩니다.

따라서 간단한 쿼리 만 사용할 수는 없으므로 보안 컨텍스트 구성 요소도 사용해야한다고 생각합니다.

답변

0

스키마를 모르지만 INNER JOIN을 수행하고 ON 절에 조건을 입력 할 수 있습니다. 쿼리를 작성하는 방법을 알아 보려면 this article about the query builder을 읽어보십시오.

+0

내 구조는 FOSUserBundle과 동일합니다.이 역할은 사용자 테이블의 한 열에 저장된 직렬화 된 배열입니다. 우리의 주요 문제점은 사용자 역할이 계층 구조를 가지고 있다는 것입니다. 그래서 ROLE_EDITOR에 ROLE_WRITER를 정의하면 ROLE_EDITOR는 자동으로 ROLE_WRITER를 갖게됩니다. 따라서 단순한 쿼리를 사용할 수는 없지만 보안 컨텍스트 구성 요소도 활용해야한다고 생각합니다. – ardianys

+0

나는 직렬화 된 데이터에 LIKE를 사용할 수 있다고 생각한다. – greg0ire

+0

도움을 주셔서 감사하지만 계층 구조 역할은 ** 보안 컨텍스트 **에 저장됩니다 ** 직렬화 된 데이터가 아닙니다. 사용자는 직렬화 된 데이터에서 ** ROLE_EDITOR ** 만 가질 수 있지만 ROLE_WRITER에 액세스 할 수도 있습니다. 문안 인사. 그냥 symfony2에있는 반면, 일반 텍스트 역할을 비교하기 때문에 – ardianys

0

Doctrine 컬렉션에는 Closure을 인수로 사용하는 filter 메서드가 있습니다.

+0

및 greg0ire 우리는이 작업을 수행 할 수있는 역할 게터 구현 같았다이 공공 기능 hasRole ($ 역할) { 복귀와 in_array (strtoupper ($ 역할), $ this- > getRoles(), true); } 공용 함수 getRoles() { $ roles = $ this-> roles; foreach ($ this-> getGroups ($ group)) { $ roles = array_merge ($ roles, $ group-> getRoles()); } // 적어도 하나의 역할을 가져야합니다. $ roles [] = static :: ROLE_DEFAULT; return array_unique ($ roles); } – ardianys

관련 문제