【问题标题】:CakePHP belongsTo multiple Models?CakePHP 属于多个模型?
【发布时间】:2012-04-24 01:05:59
【问题描述】:

如果此问题已在其他地方得到解答,我提前道歉;我在高处和低处搜索了一个现有的答案,但一无所获。也许我正在寻找错误的关键字。

我有三个模型,其中两个(学生和导师)与一个普通模型(约会)具有$hasMany 关系,该模型与其他两个模型都有$belongsTo 关系。具体型号如下...

一个学生有很多约会...

class Student extends AppModel {
    var $hasMany = array (
        'Appointment' => array (
            'foreignKey' => 'student_id'
        )
    );

一位导师有很多约会...

class Tutor extends AppModel {
    var $hasMany = array (
        'Appointment' => array (
            "foreignKey" => 'tutor_id'
        )
    );

约会属于学生和导师...

class Appointment extends AppModel {
    var $belongsTo = array (
        'Student' => array (
            'foreignKey' => 'student_id'
        ),
        'Tutor' => array (
            'foreignKey' => 'tutor_id'
        )   
    );

查看学生的记录时(例如“app/student/view/4”),我需要能够列出他们即将到来的约会的日期以及该约会的导师姓名。因此,我需要在查看 Student 模型时从 Tutor 模型(名称)访问数据。目前我只能使用$this->Student->query() 来拉取相关的导师记录来完成此操作,但这会导致学生的信息在结果数组中重复。

所有$hasMany$belongsTo 关系都可以正常工作。 CakePHP 是否有一个我缺少的内置函数来获取相关信息,还是需要在某个地方直接完成?

【问题讨论】:

  • 尝试在您的find 上设置recursive => 2。这应该会为您提供一层额外的关联模型。
  • 谢谢。这是可行的,但这是一个可扩展的解决方案吗?学生记录针对返回数组中的每个约会进行迭代。该表中有 15 个字段,每个学生有 10 多个约会,即每个查询中有 150 个额外字段。
  • 我知道,去过那里...替代方案是 (1) 可包含,(2) forcing joins,或 (3) 手动编写查询。

标签: php cakephp associations belongs-to


【解决方案1】:

您应该考虑使用Containable。如果您不熟悉它,它是一个 Behavior,您可以将其附加到模型并使用它来精确定义要包含在 find 中的关联模型,模型的数量和深度都可以。

我总是将它用于所有模型,方法是在 AppModel 中设置:

var $actsAs = array('Containable');

然后在控制器中:

$this->Student->find('first', array(
    'conditions' => ...,
    'contain' => array('Appointment' => 'Tutor'),
    ...
));

【讨论】:

  • 谢谢。我将不得不阅读更多关于 Containables 的内容。我过去曾对其进行过修补,但从未 100% 成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
相关资源
最近更新 更多