2

我需要汇总一些子模型数据并将其存储在父模型实例属性中。但是为了保存属性值,我需要调用$this->save()或者$this->saveAttributes(array('<attr name>')); 它不会永远递归地运行save()过程,如果不是,为什么不呢?事件模型内部:

protected function afterSave() 
{
    parent::afterSave();
    $contents = EventContent::model()->findAllByAttributes(array('eventId'=>$this->id));
    if ($contents) 
    {   
        $sum=0;
        foreach($contents as $content)              
            $sum += $content->cost;  

        $this->totalSum = $sum;
        $this->save(); 
        // or $this->saveAttributes(array('totalSum'));
    }

}

更新 1

正如乔恩所建议的,我可以这样做:

protected function save() 
{    
    $contents = EventContent::model()->findAllByAttributes(array('eventId'=>$this->id));
    if ($contents) 
    {   
        $sum=0;
        foreach($contents as $content)              
            $sum += $content->cost;  

        $this->totalSum = $sum; // no need to run $this->save() here            
    } 
    parent::save(); 
}

更新 2

我更新了我的问题以显示模型的相关代码。我只将子模型的总和累积到父属性中。正如问的那样,我分享了模型。这里主要是它们的关系: Event(父模型)和EventContent(子模型)与这个关系绑定:

Class EventContent extends CActiveRecord {
  ...
  public function relations()
  {
     return array(
        'event'=>array(self::BELONGS_TO, 'Event', 'eventId'),
     );
  }
}
4

1 回答 1

2

您的实现afterSave()是错误的,将导致无休止的方法调用,save()直到afterSave()PHP 达到其脚本执行时间限制。

你有两个选择:

  1. 按照 Jon 的建议实施您的代码(您的更新 1)
  2. 留在里面afterSave()saveAttributes()在里面使用以保存模型。saveAttributes()不会调用beforeSave()afterSave()如官方 API-docs中所述

在我看来,最好的方法是将您的代码移动到save()Jon 已经建议的位置。

于 2014-07-31T08:13:49.357 回答