我知道YII中函数beforeSave()
的功能,该函数用于执行某些操作,我们希望在保存数据之前执行此操作。
但是,在我们的数据保存到数据库之前我们想要实现这个,我们不能在save()调用之前直接编写这段代码( - > save()将记录存储到数据库中)
因此,我不确定为什么我们需要创建像beforeSave()这样的特定函数来执行我们需要在Save()调用之前触发的动作,当我们在save()行之前直接编写代码时。< / p>
有人可以解释一下吗?我已经搜索了很多,但是在每一页上,它都只重定向到beforeSave()函数的解释。
答案 0 :(得分:11)
Yii和其他MVC框架具有这些功能。
虽然您可以在控制器中编写“保存前”代码,但在save()
功能之前 - 建议使用beforeSave()
功能更有用。
原因1:MVC中的M
beforeSave与模型有关,因此拥有一个代码来处理模型文件中的模型属性(字段)而不是在控制器中拥有该代码更合乎逻辑。
原因2:保存是针对插入&amp;更新强>
当save()
新记录时以及insert
现有记录时,您使用update
。如果不使用beforeSave
内置函数,在保存代码之前,您必须拥有2个“手册”实例。 (“废弃”代码行)
原因3:从其他控制器保存模型
如果您被要求扩展您的应用程序,现在您必须面对需要保存相同模型的新控制器(出于某种原因 - 只是一种可能的情况),您将不得不复制“保存前”代码到该控制器。如果您使用的是内置beforeSave
功能,则不会。
总之,框架的主要目的是减少您需要编写的代码,同时保持逻辑(MVC分离)。虽然你可以做不同的事情,为什么不使用已经存在的东西?
答案 1 :(得分:4)
一个简单的例子:
我有一个包含两个日期字段的表。每次我尝试执行插入或更新时,我都需要获取当前系统日期并根据操作类型进行操作。
public function beforeSave() {
if ($this->isNewRecord) {
$this->insertDate = new CDbExpression('NOW()');
} else {
$this->updateDate = new CDbExpression('NOW()');
}
return parent::beforeSave();
}
我曾经写过这个,所以每当我在该对象上调用save()时,我都不必写。
此外,有些数据库更喜欢不同的时间格式,因此您可以在此处理它们:
public function beforeSave() {
$this->date = date('Y-m-d', $this->date);
return parent::beforeSave();
}