我在Yii有一个模特。
我如何识别Yii模型是在保存($model->save() || $model->delete())
后正在更新,插入或删除?
答案 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-audit
或sammaye/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