在CakePHP中通过触发器在关联模型之间进行更新

时间:2013-05-26 17:22:13

标签: cakephp

让我们假设以下情况:

  • A belongsTo B,C
  • B hasMany A
  • C hasMany A
  • A具有字段数量
  • B有字段total_quantity

B中的总数量累计A中所有相关个人记录的所有单独数量。

我有ModelC / edit,用户可以添加/删除/修改A。

每次附加,修改或删除A中的记录时,我都想更新B.total_quantity。

基本上,我有3种可能进行更新:

  1. 在ModelCController中手动
  2. ModelA.AfterSave中的
  3. 在数据库中使用触发器
  4. 我的第一个选择是解决方案2,但我发现了它的问题,所以我需要帮助。

    在ModelA.AfterSave中,我只有新的,修改过的数据。我怎么知道A.quantity是否已被更改?没有$ this-> old ['ModelA']或类似的东西。即使我知道这些信息,我也无法访问ModelB,因为没有$ this-> data ['ModelB'] ......

    有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

你可以研究CakePHP 2.x的AggregateCache行为,这里有一个应该放在模型B中的小片段:

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

更新:完整代码现已可用@Github: https://github.com/cwbit/cakephp-aggregate-cache

Vincent Lizzi在这里提出了代码:http://bakery.cakephp.org/articles/vincentm8/2010/08/23/aggregatecache-behavior