在CakePHP中使用Active Record模式,避免传递数组

时间:2013-11-25 21:53:00

标签: cakephp cakephp-2.3

随着我的CakePHP 2.4应用程序越来越大,我注意到我在模型层中传递了很多数组。 Cake有点让我沿着这条路走下去,因为它从它的find调用中返回数组,而不是对象。但是越来越多,这感觉就像是一种可怕的做法。

例如,在我的Job模型中,我有一个这样的方法:

public function durationInSeconds($job) {
    return $job['Job']['estimated_hours'] * 3600; // convert to seconds
}

在我想象使用活动记录模式时,它应该看起来更像这样:

public function durationInSeconds() {
    return $this->data['Job']['estimated_hours'] * 3600; // convert to seconds
}

(即,不带参数,并假设当前实例代表您要使用的作业)

第二种方式更好吗?

如果是这样,我如何使用它,例如,我正在循环find('all')调用的结果? Cake返回一个数组 - 我是否循环遍历该数组并为每一行执行read? (从数据库中重新获取信息似乎是浪费)

或者我应该实现一种模仿setActiveRecord的{​​{1}}方法,如下所示:

read

或者有更好的方法吗?

编辑:function setActiveRecord($row){ $this->id = $row['Job']['id']; $this->dtaa = $row; } 方法只是一个最简单的例子。我知道对于那个特例,我可以使用虚拟字段。但在其他情况下,我的方法有些复杂,虚拟字段不会这样做。

1 个答案:

答案 0 :(得分:0)

最佳解决方案取决于您需要解决的问题。但是如果你必须为每个结果行调用一个函数,可能需要重新设计获取所有必要数据的查询。

在您显示的这种情况下,您可以在作业模型上使用虚拟字段:

$this->virtualFields = array(
    'duration_in_seconds' => 'Job.estimated_hours * 3600',
):

..和/或你可以使用这样的方法:

public function durationInSeconds($id = null) {
    if (!empty($id)) {
        $this->id = $id;
    }
    return $this->field('estimated_hours') * 3600; // convert to seconds
}