【问题标题】:How to check model is update , insert or delete in Yii2如何在 Yii2 中检查模型是否更新、插入或删除
【发布时间】:2018-06-12 06:16:24
【问题描述】:

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

【问题讨论】:

  • 请您说明您需要什么。还请与花时间回答您的帖子的开发人员互动。

标签: activerecord model yii2


【解决方案1】:

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

我不知道你为什么有这个声明,但如果你因为某种原因不能改变它并想知道发生了什么,你可以使用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 {
    ....
}

【讨论】:

  • 我想保存所有模型事件以进行更新、删除和插入日志,包括错误消息。所以我可以监控这个表的记录变化。因此,在 $model->save() 或 $model->delete() 之后,我可以获取插入、更新或删除的事件属性模型。或者我必须为此操作创建一些变量。因为没有一张桌子。
【解决方案2】:

如果您只想记录模型发生的情况,您可以使用以下审计跟踪扩展之一:bedezign/yii2-auditsammaye/yii2-audittrail

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

【讨论】:

    【解决方案3】:

    最简单的方法是在保存时检查。我的意思是当你保存你的模型时,它会返回一个真/假值,如果为假,模型将包含一个数组或错误消息。

    这也是您解决问题、发送警报、打印调试信息或针对错误执行操作的最简单方法。

    $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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-16
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      相关资源
      最近更新 更多