YII - 当你可以在Save()函数之前编码时,为什么要使用beforeSave()

时间:2015-05-12 06:01:14

标签: php yii save before-save

我知道YII中函数beforeSave()的功能,该函数用于执行某些操作,我们希望在保存数据之前执行此操作。

但是,在我们的数据保存到数据库之前我们想要实现这个,我们不能在save()调用之前直接编写这段代码( - > save()将记录存储到数据库中)

因此,我不确定为什么我们需要创建像beforeSave()这样的特定函数来执行我们需要在Save()调用之前触发的动作,当我们在save()行之前直接编写代码时。< / p>

有人可以解释一下吗?我已经搜索了很多,但是在每一页上,它都只重定向到beforeSave()函数的解释。

2 个答案:

答案 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();
}