2013-11-03 2 views
3

CakePHP 애플리케이션에 User 모델과 Role 모델이 있습니다. 두 모델 사이의 관계는 다음과 같다 :cakephp 관련 모델의 쿼리 조건을 찾으십시오.

User $belongsTo Role 
Role $hasMany User 

내가 특정 역할로 모든 사용자를 찾기 위해 User 모델에 대한 쿼리를 만들고 싶어 (의이 역할 관리자를 가정 해 봅시다). 이 같은 내 쿼리했다 :

$supervisors = $this->User->find('all', array(
    'contain' => array(
     'Role' => array(
      'conditions' => array(
       'Role.name' => 'Supervisor' 
      ) 
     ) 
    ) 
)); 

을하지만 위의 질의 내 사용자 테이블에 나에게 모든 사용자를 반환합니다. Supervisor 역할을 가진 사용자 만 리턴하지 않습니다. 두 개의 쿼리를 수행하면 Role 모델에서 하나의 역할 유형 '감독자'의 ID를 찾은 다음 사용자 모델에서 다른 쿼리를 수행하고 내 사용자 모델의 조건에서 감독자 역할 레코드의 ID를 전달합니다. like :

$supervisor_role_id = $this->Role->field('id', array('Role.name' => 'Supervisor')); 

$supervisors = $this->User->find('all', array(
    'conditions' => array(
     'User.role_id' => $supervisor_role_id 
    ) 
)); 

위의 쿼리를 사용하면 원하는 결과를 얻을 수 있습니다. 하지만이 작업을 수행하기 위해 2 개의 쿼리를 수행하고 싶지 않습니다. 첫 번째 접근 방식이 효과가없는 이유는 무엇입니까? 어떤 아이디어라도 제발?

답변

6

이유 당신의 시도가

CakePHP의 Containble 행동은 각 모델에 대해 별도의 쿼리를 만들어 작동하지 않았다 감사드립니다. 그래서 당신이 한 일은 기본적으로 다음과 같이 설명되었습니다 : "모든 사용자 찾기." '감독자'라는 이름으로 모든 역할을 찾으십시오. 보시다시피 두 조건 사이에는 아무런 조건이 없습니다.

그래서, 당신은 다음 중 하나를 수행 할 수

1) [쉬운 방법] 쿼리 다른 방법으로 주위

Role 모델 쿼리하고 사용자 (들입니다 포함). 이것은 (당신이 제공 한 조건에 따라) 당신이 원하는 역할을 끌어 낸 다음 그 사용자의/모든 것을 포함합니다.

참고 - '사용자'모델을 이미로드했거나 (사용자가 UsersController에 있기 때문에 기본적으로로드 된 경우) 다음과 같이 찾을 수 있습니다. $this->User->Role->find(..... - 그렇게하지 않아도됩니다. Role 모델을 별도로로드하십시오.

2) 사용 (이것은 당신이 데이터를 연관된를 기반으로 상위 모델의 결과를 제한 할 수 있습니다)

CakePHP Book on Joining Tables를 참조 결합합니다.

+0

"User $ belongsTo Role"따라서이 경우 실제로 사용자를 쿼리하고 역할에 참여하는 것이 정확합니다. 올바르게 구성된 경우 별도의 쿼리를 생성해서는 안됩니다. – mark

+0

@mark - 조인스 (# 2)를 사용할 수 있다고 언급했습니다. 또는 그는 쿼리를 되돌리고 Containable을 사용할 수 있습니다. 다양한 옵션. – Dave