我有一个 Eloquent 模型,想要跟踪随着时间的推移所做的每一个更改。我在模型上启用了软删除,并且该部分工作正常。
当我想保存模型时,我会克隆它,删除原始模型并保存克隆。这样我就可以看到模型随时间的每一次变化。
我想做的是将逻辑内置到模型本身中,在调用普通模型 ->save() 时模仿这种行为。
这可以做到吗?
最佳答案
当然,您可以使用事件来做到这一点。在你的模型上,类似:
protected static function boot() {
parent::boot();
self::saving(function (Model $model) {
if ($model->isDirty()) {
// clone the $model here
}
});
self::saved(function (Model $model) {
if ($model->isDirty()) {
// delete the model here
}
});
}
您会注意到我同时使用了 saving
和 saved
事件。我这样做是有目的地的,以便您可以在更新模型数据之前克隆模型(通过从数据库重新检索模型或使用模型中存储的原始数据),然后模型不会被删除,直到它也被更新并且保存到数据库,为您提供您想要实现的模式。
但郑重声明,我不喜欢这种版本控制风格。您如何知道一条记录是否确实被删除或只是历史记录?使用这种方法也很难解释关系的变化。我更喜欢日志样式(您可以在其中保存更改的值的序列化列表并根据需要进行转换)。这将导致数据库本身中的数据更少(因为理想情况下您只保存更改的列)、定义更清晰的数据结构以及由多态关系管理的中央表中记录的所有更新。
如果你想按照自己的方式来做,我认为更好的方法是克隆你的模型并删除克隆。我认为,这种方式对用户的干扰较小,因为 ID 等不会不断变化,并且对于其他用户来说可能已经过时。无论如何,我更愿意做一个序列化列表。
关于laravel - 保存时软删除 Eloquent 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33653354/