2

私が抱えている問題を説明するために、例を使用します。学生が1つ以上の放課後コースに申し込むことができるシステムを構築しているとしましょう。しかし、それが有効であるためには、学校関係者が申し込みを承認する必要があります。だから私はこれらのモデルを持っています:

  • コース(「Teacher」に属し、hasAndBelongsToMany「Student」)
  • 学生(hasAndBelongsToMany「コース」)
  • 先生(hasMany "Course")

ここで、9年生向けの未承認のサインアップすべてのリストを見たいとしましょう。簡単だ:

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

私が苦労しているのは、教師のデータ(IDだけではない)も取得することです。私はこれを試しました:

$this->request->data = $this->Student->CoursesStudent->find('all', array(
    'conditions' => array(
        'CoursesStudent.is_approved' => null,
        'Student.grade' => 9
    ),
    'contain' => array(
        'CoursesStudent',
        'Course' => array(
            'Teacher' => array(
                'fields' => array(
                    'Teacher.id',
                    'Teacher.name'
                )
            )
        ),
        'Student'
    )
));

ただし、返される配列には何の影響もありません。これを既存のCakePHPプロジェクトに簡単に投入して操作できるようにするために、データベーススキーマとデータを次に示し、既存のCakePHPプロジェクトのランダムアクションに貼り付けることができるものを示しますこれは私が取得しようとしているものです(教師のデータがそこにあることに注意してください):

Array
(
    [0] => Array
        (
            [CoursesStudent] => Array
                (
                    [id] => 1
                    [course_id] => 1
                    [student_id] => 1
                    [is_approved] => 
                    [created] => 2012-12-11 00:00:00
                    [modified] => 2012-12-11 00:00:00
                )

            [Course] => Array
                (
                    [id] => 1
                    [teacher_id] => 1
                    [title] => Introduction to Improvisation
                    [start_date] => 2012-12-17
                    [end_date] => 2012-12-21
                    [created] => 2012-12-11 00:00:00
                    [modified] => 2012-12-11 00:00:00
                    [Teacher] => Array
                        (
                            [id] => 1
                            [first_name] => John
                            [last_name] => Doe
                            [created] => 2012-12-11 00:00:00
                            [modified] => 2012-12-11 00:00:00
                        )

                )

            [Student] => Array
                (
                    [id] => 1
                    [first_name] => Bill
                    [last_name] => Brown
                    [grade] => 9
                    [created] => 2012-12-11 00:00:00
                    [modified] => 2012-12-11 00:00:00
                )

        )

)

ありがとう!

4

1 に答える 1

1

使用する前に に設定$recursiveする必要があります。-1contain()

また、モデルが Containable Behavior を使用するように設定されていることを確認してください。この場合、「Course」にも何かが含まれているため、Containable 動作も使用する必要があります。

(AppModel で以下$actsAsを設定して、すべてのモデルで Containable を使用できるようにすることを検討できます。)

//in your CoursesStudent model (and in your Course model)
public $actsAs = array('Containable');

そして、ここにあなたの発見がありますが、最初に再帰を設定します:

$this->Student->CoursesStudent->recursive = -1;
$this->request->data = $this->Student->CoursesStudent->find('all', array(
    'conditions' => array(
        'CoursesStudent.is_approved' => null,
        'Student.grade' => 9
    ),
    'contain' => array(
        'CoursesStudent',
        'Course' => array(
            'Teacher' => array(
                'fields' => array(
                    'Teacher.id',
                    'Teacher.name'
                )
            )
        ),
        'Student'
    )
));
于 2012-12-11T21:23:00.610 に答える