如何检查模型是在Yii2中更新,插入或删除

时间:2018-06-12 06:16:25

标签: activerecord model yii2

我在Yii有一个模特。 我如何识别Yii模型是在保存($model->save() || $model->delete())后正在更新,插入或删除?

3 个答案:

答案 0 :(得分:2)

使用$model->isNewRecord,您可以检查模型是否已保存或更新。使用($model->save() || $model->delete()),您无法直接确定发生了什么。如果$model->save()未成功,则由于验证错误。 $model->delete()将被调用。如果删除成功,则为1(即为真)。

我不知道为什么你有这个陈述,但如果由于某种原因你不能改变它并想知道发生了什么,你可以使用events

$model->on(yii\db\BaseActiveRecord::EVENT_AFTER_INSERT, function(yii\db\AfterSaveEvent $e) {
    // model was inserted
});
$model->on(yii\db\BaseActiveRecord::EVENT_AFTER_UPDATE, function(yii\db\AfterSaveEvent $e) {
    // model was updated
});
$model->on(yii\db\BaseActiveRecord::EVENT_AFTER_DELETE, function(yii\base\Event $e) {
    // model was deleted
});

如果可以扩展模型类,则可以覆盖相应的方法,而不是附加事件处理程序。然后你可以创建一个中间类来处理你需要做的事情,并从这个中间类派生出任何模型类:

class ExtendedActiveRecord extends yii\db\ActiveRecord {
    public function afterSave($insert, $changedAttributes) {
        // Do anything you want
        if($insert)
            // model was inserted
        else
            // model was deleted
        parent::afterSave($insert, $changedAttributes);
    }
    public function afterDelete() {
        // Do anything you want
        parent::afterDelete();
    }
}

class ModelA extends ExtendedActiveRecord {
    ....
}
class ModelB extends ExtendedActiveRecord {
    ....
}

答案 1 :(得分:1)

如果您只想记录模型发生的事情,可以使用其中一个审计跟踪扩展程序:bedezign/yii2-auditsammaye/yii2-audittrail

如果您想编写自己的行为,您可能会对$dirtyAttributes属性感兴趣,该属性包含从数据库保存/获取后已更改的属性。

答案 2 :(得分:0)

最简单的方法是检查保存时间。我的意思是,当您保存模型时,它将返回true / false值,如果为false,则模型将包含数组或错误消息。

这也是最简单的方法,您可以解决问题,发送警报,打印调试信息或对错误做些什么。

$model = new MyTable();
$model->name = example;
if($model->save()){
  //Nice its inserted/updated, go ahead
} else {
  //Woops error here, not inserted
}

来吧,试一试。

在此处阅读更多内容:https://www.yiiframework.com/doc/api/2.0/yii-db-baseactiverecord#save()-detail