【问题标题】:CakePHP HABTM recursive issueCakePHP HABTM 递归问题
【发布时间】:2012-11-29 05:24:40
【问题描述】:

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

  • 日历(属于“教师”,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'] 将有 [Teacher],这是我想要的,但它也会有 [Student],这是我不想要的。此外,$this->request->data[0]['Student'] 将包含我不想要的子数组。 Containable 似乎可以解决这个问题,但我也无法让它工作。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我发现它在很多场合都非常有用,默认情况下它没有设置为-1,所以它可能不是那么糟糕......如果我想检索更少的数据,那就是我设置它的时候到 -1 或者我像你说的那样使用可包含。
    • @Dave 感谢您的回答,但是,正如我所说,我尝试了Containable,但也无法使其正常工作。我在find 参数中有这个:'contain' => array('CalendarsStudent', 'Calendar' => array('Teacher'), 'Student')。它对返回的数组绝对没有影响,无论我是否有recursive
    • @Nick - 使用 Containable 时,递归必须设置为 -1。如果您无法让 Containable 工作,请将其发布为您的问题“如何让 Containable 工作”或其他内容,但是 - 在这种情况下,Containable 是要走的路。
    • @Steve - 与经验丰富的 CakePHP 开发人员交谈,我猜你会得到 99% 的“不使用递归”协议。我相信他们甚至计划在 CakePHP3 中删除整个“递归”的想法。包容性在很多方面都好得多,一旦你理解它,它就非常简单。
    • @Dave 我会考虑的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多