随着我的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;
}
方法只是一个最简单的例子。我知道对于那个特例,我可以使用虚拟字段。但在其他情况下,我的方法有些复杂,虚拟字段不会这样做。
答案 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
}