2013-05-26 99 views
0

關聯模型之間的CakePHP更新讓我們假設以下情況:在通過觸發器

  • 甲屬於關聯B,C
  • 乙的hasMany甲
  • Ç的hasMany甲
  • A具有場量
  • 乙有字段total_quantity

總數B總和所有指標在A.

的所有相關的個人記錄維杜阿爾批量我ModelC /編輯,用戶可以添加/刪除/修改A.

我要當一個記錄被追加每次更新B.total_quantity,修改或刪除。

基本上,我有3種可能性做了更新:​​使用觸發器手動

  1. 在ModelCController
  2. 在ModelA.AfterSave
  3. 數據庫

我的第一選擇是解決方案2,但我發現它有問題,所以我需要幫助。

在ModelA.AfterSave中,我只有新的修改過的數據。我怎麼知道A.quantity是否被改變了?沒有$ this-> old ['ModelA']或類似的東西。即使我可以知道這些信息,我也無法訪問ModelB,因爲沒有$ this-> data ['ModelB'] ...

任何人都可以提供幫助嗎?

+0

您是否聽說過CakePHP模型的counterCache功能?請參閱http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html –

+0

@JustinT。 counterCache不會總和字段 – Dave

回答

1

你可以學習的CakePHP的2.x的AggregateCache行爲,這裏是一個小片段,應該坐在你的模型B:

public $actsAs = array(
    'AggregateCache'=>array(
     array('field'=>'quantity','model'=>'A', 'sum'=>'total_quantity','recursive'=>-1), 
    ) 
); 

UPDATE:全碼現已@Github: https://github.com/cwbit/cakephp-aggregate-cache

Vincent Lizzi在此處提供代碼:http://bakery.cakephp.org/articles/vincentm8/2010/08/23/aggregatecache-behavior

+0

感謝您的建議。我現在正在研究這個偉大的行爲,看起來它會適合我的需要。 –

+0

@ZoranKalinić:不客氣,如果有用,對別人有幫助,並將其標記爲正確答案 –