2012-03-28 36 views
0

virtualFields var可能是鏈接表中字段的總和嗎?虛擬字段可以基於cakephp中的鏈接數據嗎?

例如,比方說,發票模型,你可以有

public $virtualFields = array(
    'invoiceNett' => 'SUM(InvoiceLine.nett)' 
); 

但顯然只是總結屬於該發票行?

謝謝。

==使用CakePHP 2.0

+0

感謝您的所有答案。我想現在歸結爲「我應該嗎?」,而不是「我能嗎?」。如前所述,這意味着它取決於每個應用程序。 – khany 2012-05-02 13:23:44

回答

0

您可以使用afterFind回調來獲得總和。這避免了存儲計算出的值,應儘可能避免這些值。

function afterFind($results) 
{ 
    foreach($results as &$result) 
    { 

     /* 
     Use something like: 

     $this->InvoiceLine->find('all', array('fields'  => array('SUM(InvoiceLine.nett) as total'), 
               'conditions' => array('invoice_id' => $result['Invoice']['id']))); 
     */ 
    } 
    unset($result); 
} 
+0

存儲計算值有什麼問題?國際海事組織,這是一個比每次需要數據時都要做額外查詢更好的方法。 – Dave 2012-03-28 15:31:53

+1

存儲從其他字段和值中計算出的值會帶來計算結果與計算值之間失去同步的風險。如果數據庫是從另一個腳本修改而不是Cake應用程序會發生什麼?'beforeSave'不會被調用,並且計算的值將會是錯誤的。如果真的需要存儲計算值,那麼最好在數據庫本身中使用觸發器來執行計算。 – nIcO 2012-03-28 21:56:37

+1

似乎高度依賴於您正在計算/添加的應用程序和數據。但是我看到你對某些應用程序的觀點。 – Dave 2012-03-28 23:16:46

0

據我知道,做到這一點的最好辦法是有一個實際的total場,並對其進行更新隨時保存數據(可能有afterSave callback method)。

因此 - 只要保存了一個InvoiceLine,就會運行一些代碼,以新的總和更新它的相關聯的Invoice

//InvoiceLine model 
public function beforeSave() { 
    //code to update Invoice's "total" field 
} 
0

理論上,是的,如果該鏈接表是加入的關聯關係(belongsTo和hasOne)。

但是,這將是一個可憐的主意,因爲如果你決定不包括該表,你會產生一個SQL錯誤。

你最好有一個單獨的函數獲取數據或創建一個嵌套SQL查詢的虛擬字段。

0

定義在各型號將更有意義,你的虛擬領域。

如果不這樣做,你將打破MVC模式。

您可以使用其他相關模型中的該虛擬字段。

如果您不想在所有相關模型中使用它們,則可以在定義關係時始終使用字段 屬性。

public $hasMany = array(
    'IwantVirtualField' => array(
     'className' => 'MyModel', 
     ... 
    ) 
); 

在一種模式,你不希望虛擬現場 公共$屬於關聯=陣列( 'IwantVirtualField'=>陣列( '的className'=> 'MyModel1', '域'=>陣列('MyModel1.id','MyModel1.name') ... ) );

相關問題