2012-12-11 5 views
0

제가 겪고있는 문제를 설명하기 위해 예제를 사용하겠습니다. 방과 후 수업에 등록 할 수있는 시스템을 구축 중이라고 가정 해 봅시다. 그러나 관리자는 가입 절차가 유효하도록 승인해야합니다. 그래서이 모델이 있습니다CakePHP HABTM 재귀적인 문제

  • 일정 (속한 "교사", hasAndBelongsToMany의 "학생")
  • 학생 (hasAndBelongsToMany의 "달력")
  • 교사 (hasMany의 "달력")

이제 9 학년 학생들을위한 승인되지 않은 모든 가입 목록을보고 싶습니다. 목록에 달력 날짜, 학생 이름 및 교사 이름을 포함 시키길 원합니다.

$this->request->data = $this->Student->CalendarsStudent->find('all', array(
    'conditions' => array(
     'CalendarsStudent.is_approved' => null, 
     'Student.grade' => 9 
    ) 
)); 

위의 코드의 문제는 반환 된 배열이 교사의 이름이 빠져 있다는 점이다 : 나는 find 매개 변수에 'recursive' => 2를 추가 할 경우

Array 
(
    [0] => Array 
     (
      [CalendarsStudent] => Array 
       (
        [id] => 1274 
        [calendar_id] => 200 
        [student_id] => 872 
        [is_approved] => 
       ) 

      [Calendar] => Array 
       (
        [id] => 200 
        [date] => 2012-12-17 
        [teacher_id] => 1 
        [total_slots] => 15 
       ) 

      [Student] => Array 
       (
        [id] => 872 
        [teacher_id] => 1 
        [first_name] => Billy 
        [last_name] => Smith 
        [grade] => 9 
       ) 

     ) 

) 

을 나는 방법을 얻을 나는 같은 것을 할 것 너무 많은 정보. $this->request->data[0]['Calendar']은 내가 원하는대로 [Teacher]을 가지지 만, 원하지 않는 것은 [Student]이 될 것입니다. 또한 $this->request->data[0]['Student']에는 내가 원하지 않는 서브 어레이가 있습니다. Containable이 문제를 해결할 것으로 보이지만 그 중 하나는 작동하지 않습니다.

아이디어가 있으십니까?

답변

2

CakePHP의 [Containable Behavior]을 사용하십시오. 그것은 놀랍습니다 - 사용하기 쉽고 원하는 것을 반환합니다.

사이드 노트 : ANYTHING에 대해 -1 이외의 것으로 "재귀 적"을 사용하는 경우에는 빨간색 플래그 여야합니다. 포함 할 수있는 가장 확실한 방법은 반환 할 데이터를 쉽고 정확하게 지정할 수 있기 때문입니다. 재귀는 종종 메모리 문제 및 기타 나쁜 점을 유발합니다.

모범 사례 :을으로 설정하고 AppModel.php에 설정하지 말고 다른 어떤 것도 설정하지 마십시오.

+0

은 내가 -1로 설정하면 다음, 그것은 -1로 설정되어 있지 않습니다 그래서 난 적은 데이터를 검색하려는 경우가 ... 을 그렇게 나쁘지 않을 수도 있습니다 많은 경우에 기본적으로 매우 유용 나는 당신이 말한 것처럼 수용 할 수있는 것을 사용합니다. – Alvaro

+0

@Dave 나는 당신의 대답을 고맙게 생각하지만, 내가 말했듯이, 나는 'Containable'을 시도해 보았고 그렇게 할 수 없었다. 배열에 'contains'=> array ('CalendarsStudent', 'Calendar'=> 배열 ('Teacher'), 'Student')'매개 변수에 'find'매개 변수가 있습니다. 거기에'recursive'가 있는지 여부에 관계없이 반환 된 배열에는 전혀 영향을 미치지 않았습니다. – Nick

+0

Container를 사용할 때는 @Nick - recursive를 -1로 설정해야합니다. 당신이 Containable을 일하게 할 수 없다면, 질문을 "일할 수있는 용기있는 방법"으로 게시하십시오. 그러나이 경우 Containable은 갈 길입니다. – Dave