0

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

  • 日历(属于“老师”,hasAndBelongsToMany“学生”)
  • 学生(hasAndBelongsToMany“日历”)
  • 老师(有很多“日历”)

现在假设我想查看所有针对九年级学生的未批准注册的列表。我希望该列表包含日历日期、学生姓名和教师姓名。我会做这样的事情:

$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']will have [Teacher],这是我想要的,但它也会有[Student],这是我不想要的。此外,$this->request->data[0]['Student']将有我不想要的子数组。似乎Containable可以解决这个问题,但我也无法让它工作。

有任何想法吗?

4

1 回答 1

2

使用 CakePHP 的[Containable Behavior]。这太棒了 - 易于使用,并且会返回您想要的任何东西。

旁注:如果您将“递归”用作除 -1 之外的任何东西,它应该是一个危险信号。Containable 是绝对可行的方法,因为它可以让您轻松准确地指定要返回的数据。递归通常会导致内存问题和/或其他不良情况。

最佳实践 IMO:在您的 AppModel.php 中 设置$recursive = -1;,并且永远不要将其设置为其他任何东西......永远。

于 2012-12-11T16:21:52.917 回答