在afterSave()中保存模型实例,不会运行递归吗?

时间:2014-07-29 12:38:32

标签: php recursion yii after-save

我需要计算一些子模型数据并将其存储在父模型实例属性中。但是为了保存属性值,我需要调用$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

根据Jon的建议,我可以这样做:

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

我已经更新了我的问题以显示模型&#39;相关代码。我只从子模型到父属性累加总和。 正如 lin 所说,我分享模特。这里最重要的是他们的关系: 事件(父模型)和 EventContent (子模型)与此关系绑定:

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

1 个答案:

答案 0 :(得分:1)

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

您有两种选择:

  1. 按照Jon(您的更新1)
  2. 的建议实施您的代码
  3. afterSave()保持联系并使用saveAttributes()保存模型。 saveAttributes()不会按照官方API-docs
  4. 中的说明致电beforeSave()afterSave()

    在我看来,最好的方法是将您的代码移至save(),如Jon已经建议的那样。