CakePHP可以使用HABTM

时间:2012-12-11 18:44:55

标签: cakephp has-and-belongs-to-many containable

为了解释我遇到的问题,我将使用一个例子。假设我正在建立一个学生可以报名参加一个或多个课外课程的系统,但是学校官员必须批准注册以使其有效。所以我有这些模型:

  • 课程(属于“老师”,hasAndBelongsToMany“学生”)
  • 学生(hasAndBelongsToMany“课程”)
  • 老师(hasMany“课程”)

现在让我们说我想查看一份针对九年级学生的所有未批准注册的列表。这很简单:

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

我正在努力解决的问题是提取教师的数据(不仅仅是他们的身份证)。我试过这个:

$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项目中,here是数据库模式和数据,here是您可以粘贴到现有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
                )

        )

)

谢谢!

1 个答案:

答案 0 :(得分:1)

在使用$recursive之前,您必须将-1设置为contain()

此外,请确保您的模型设置为使用可包含行为。在这种情况下,由于“课程”也包含某些内容,因此它也需要使用“可包含”行为。

(您可以考虑在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'
    )
));