2013-11-25 33 views
2

隨着我的CakePHP 2.4應用程序變大,我注意到我在模型層中傳遞了大量數組。蛋糕有點兒讓我走這條路,因爲它返回數組,而不是對象,從它的find調用。但越來越多,這感覺很糟糕的做法。在CakePHP中使用Active Record模式,並避免傳遞數組周圍

例如,在我的工作模式,我有一個方法是這樣的:

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方法的模仿read,像這樣:

function setActiveRecord($row){ 
    $this->id = $row['Job']['id']; 
    $this->dtaa = $row; 
} 

還是有更好的辦法?

編輯:durationInSeconds方法只是一個最簡單的例子。我知道這個特殊情況,我可以使用虛擬領域。但在其他情況下,我已經有了一些複雜的方法,虛擬域不會這樣做。

回答

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 
} 
+0

的'durationInSeconds'方法只是一個最簡單的情況,我以此爲例。在其他情況下,我已經爲每行提供了相當數量業務邏輯的方法,並且虛擬域不會削減它。對不起,我會更新我的問題以澄清這一點。 –