CakePHP HABTM递归问题

时间:2012-12-11 16:13:15

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

为了解释我遇到的问题,我将使用一个例子。假设我正在建立一个学生可以报名参加课后班级的系统,但管理员必须批准注册才能使其有效。所以我有这些模型:

  • 日历(属于“老师”,hasAndBelongsToMany“学生”)
  • 学生(hasAndBelongsToMany“日历”)
  • 老师(hasMany“日历”)

现在让我们说我想查看一份针对九年级学生的所有未批准注册的列表。我希望列表包括日历日期,学生姓名和教师姓名。我会做这样的事情:

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

上述代码的问题在于返回的数组缺少教师姓名:

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
                )

        )

)

如果我将'recursive' => 2添加到find参数,我会得到太多信息。 $this->request->data[0]['Calendar'][Teacher],这就是我想要的,但它也会有[Student],这是我不想要的。此外,$this->request->data[0]['Student']将包含我不想要的子阵列。似乎Containable会解决这个问题,但我也无法解决这个问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

使用CakePHP的[Containable Behavior]。这太棒了 - 易于使用,可以随意返回。

旁注:如果您使用“递归”作为ANYTHING以外的任何值,则应为红色标记。 Containable是绝对的方式,因为它可以让您轻松准确地指定要返回的数据。递归通常会导致内存问题或其他不良问题。

最佳做法IMO:在AppModel.php中设置$recursive = -1;,永远不要将其设置为其他任何内容......