我需要计算一些子模型数据并将其存储在父模型实例属性中。但是为了保存属性值,我需要调用$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'));
}
}
根据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();
}
我已经更新了我的问题以显示模型&#39;相关代码。我只从子模型到父属性累加总和。 正如 lin 所说,我分享模特。这里最重要的是他们的关系: 事件(父模型)和 EventContent (子模型)与此关系绑定:
Class EventContent extends CActiveRecord {
...
public function relations()
{
return array(
'event'=>array(self::BELONGS_TO, 'Event', 'eventId'),
);
}
}
答案 0 :(得分:1)
afterSave()
的实现是错误的,并且会导致save()
和afterSave()
的无限方法调用,直到PHP达到其脚本执行时间限制。
您有两种选择:
afterSave()
保持联系并使用saveAttributes()
保存模型。 saveAttributes()
不会按照官方API-docs beforeSave()
和afterSave()
醇>
在我看来,最好的方法是将您的代码移至save()
,如Jon已经建议的那样。