【发布时间】:2018-06-12 06:16:24
【问题描述】:
我在 Yii 中有一个模型。
保存 ($model->save() || $model->delete()) 后如何识别 Yii 模型正在更新、插入或删除?
【问题讨论】:
-
请您说明您需要什么。还请与花时间回答您的帖子的开发人员互动。
标签: activerecord model yii2
我在 Yii 中有一个模型。
保存 ($model->save() || $model->delete()) 后如何识别 Yii 模型正在更新、插入或删除?
【问题讨论】:
标签: activerecord model yii2
使用$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 {
....
}
【讨论】:
如果您只想记录模型发生的情况,您可以使用以下审计跟踪扩展之一:bedezign/yii2-audit 或 sammaye/yii2-audittrail
如果您想编写自己的行为,您可能会对 $dirtyAttributes 属性感兴趣,该属性包含在从数据库保存/获取后已更改的属性。
【讨论】:
最简单的方法是在保存时检查。我的意思是当你保存你的模型时,它会返回一个真/假值,如果为假,模型将包含一个数组或错误消息。
这也是您解决问题、发送警报、打印调试信息或针对错误执行操作的最简单方法。
$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
【讨论】: