2014-02-27 2 views
0

find() 결과 때문에 혼란스러워졌습니다. 이것은 내 구성입니다.Model :: find()를 사용할 때 연결에 대한 CakePHP 조건 절

먼저 User.role 값은 student, admin 및 기타 값일 수 있습니다.

// Book 
public $belongsTo = array(
    'Student' => array(
     'className' => 'User', 
     'foreignKey' => 'student_id' 
     'conditions' => array('User.role' => 'student') 
    ); 
); 

는 내가 그 역할 'student'을 만 사용자를 얻기 위해 기다리고 있었다 $this->Book->Student->find('list'); 같은 모델을 체인 때, 대신, 모든 사용자를 가져옵니다. 여기서 무슨 일이 일어나고있는 지, 연결 정의에 대해 conditions은 무엇이며 어디에서 사용할 수 있으며 사용할 수없는 것입니까? 모든 단서가 도움이 될 것입니다, 감사합니다.

PS : 나는 find()에 조건을 넣을 수 있다는 것을 알고는, 그 모델 안에 당신이 미스가 문제

답변

0

와 함께, 당신은 "유형을"매개 변수를 설정해야합니다 " 가입 왼쪽"입니다 관련 모델 객체에 액세스합니다. $ this-> Book-> Student에 액세스하면 Student 모델에 액세스하여 범위에서 작업하게됩니다. 정의 된 연결의 조건은 액세스 된 객체의 컨텍스트에서만 작동합니다. 이 책에서 발견을하고 그 책에 대한 학생들의 경로를 게시하면

그래서 :

$this->Book->find('first', array('contain' => array('Student')); 

코드는 제대로 작동합니다. 이 책에는 stundent 역할을하는 첫 번째 사용자가 포함되어 있습니다. BUT 당신의 협회가 틀린 경우 : hasMany 여야합니다. 왜 책이 속한 경우 한 학생에게 역할로 책을 걸러 낼 수 있습니까?

사용자를 역할별로 필터링하려면 beforeFind()에서 확인되는 쿼리 매개 변수를 구현할 수 있습니다. pseudocode : ifsetet roleFilter 그런 다음 roleFilter에서 해당 역할을 필터링하기 위해 경합을 추가하십시오.

또는 페이지 매김을 할 필요가없는 경우 사용자 모델에서 조건이있는 find ('list')를 반환하는 getStudents() 메서드 만 만들면됩니다.

또는 Student extends User 필터를 beforeFind()에 배치하고 Book 연결에서 User 모델 대신 해당 모델을 사용하십시오.

모델 수준 또는 모델별로 필터링하려면 마지막 옵션이 좋은 옵션이라고 생각합니다. $useTable$name을 설정하는 것을 잊지 마십시오. 상속 된 모델이 문제를 일으킬 수 있습니다.

0

아니다.
이 시도 :

public $belongsTo = array(
    'Student' => array(
     'className' => 'User', 
     'foreignKey' => 'student_id', //<------ miss 
     'conditions' => array('User.role' => 'student') 
    ); 
); 

요이 당신이 만드는 실제 쿼리 무엇인지 확인하는 쿼리를 디버깅 할 수 있습니다.
개인적으로 나는이 접근법을 사용하지 않았습니다. RolesUser.role_id과 같은 외래 키를 다른 테이블과 함께 사용하는 것을 선호합니다.
이 방법을 사용하면 앱 내부에서 더 많은 유연성을 얻을 수 있습니다.
내부 컨트롤러가 쿼리를 잘 검사하는 조건을 선호 한 후에 모든 쿼리가 항상 학생의 역할을 검색하지 않고 나머지 역할에 문제가 될 수 있으므로 내부 컨트롤러를 볼 수 있기 때문에 조건없이 찾을 수 있지만 귀하의 모델에 특정 조건이 있기 때문에 올바른 가치를 취하지 않습니다.

나를 위해 좋은 방법은 새 테이블을 만들고 외래 키를 사용하여 컨트롤러의 동작 내부의 조건이 무엇인지 잘 볼 수 있도록하는 것입니다.

+0

죄송합니다. 게시물에 오타를 만들었습니다. 코드는 문제가 없습니다. 조금 연구 했으니 모델 체인 (예 :'$ this-> Book-> Student-> find()')이 $ this-> Book-> find() Student를 포함하는 것과 같지 않을 수 있습니까? 어쩌면 내가 모델 체인의 잘못된 생각을 가지고있다 –

+0

예는 동일하지만 모델에 컨트롤러가없는 곳을 두는 것이 좋습니다. @ChristopherFrancisco –

0

기본에 대한 모든 관계는 관련 데이터와 차이가있다 "내부"값

// Book 
public $belongsTo = array(
    'Student' => array(
     'className' => 'User', 
     'foreignKey' => 'student_id' 
     'conditions' => array('Student.role' => 'student'), // <-- Fix That (field name) 
     'type' => 'inner', // <-- add that 
    ); 
); 
+0

작동하지 않는 것 같습니다. 이러한 관계는 모델 체인시 작동합니까 아니면 자체적으로 만 작동합니까? 아마도 SQL 로그가 JOIN 또는 INHER JOIN을 말하거나 LEFT하지 않기 때문에 문제가 될 수 있습니다. –

+0

둘 다 작동합니다. 학생들 만 얻고 싶다면 찾기 방법에 조건을 추가해야합니다. 왜냐하면 모든 모델에 해당 관계가 있기 때문입니다. –