laravel - 保存时软删除 Eloquent 模型

标签 laravel model eloquent laravel-5.1 soft-delete

我有一个 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
        }
    });
}

您会注意到我同时使用了 savingsaved 事件。我这样做是有目的地的,以便您可以在更新模型数据之前克隆模型(通过从数据库重新检索模型或使用模型中存储的原始数据),然后模型不会被删除,直到它也被更新并且保存到数据库,为您提供您想要实现的模式。

但郑重声明,我不喜欢这种版本控制风格。您如何知道一条记录是否确实被删除或只是历史记录?使用这种方法也很难解释关系的变化。我更喜欢日志样式(您可以在其中保存更改的值的序列化列表并根据需要进行转换)。这将导致数据库本身中的数据更少(因为理想情况下您只保存更改的列)、定义更清晰的数据结构以及由多态关系管理的中央表中记录的所有更新。

如果你想按照自己的方式来做,我认为更好的方法是克隆你的模型并删除克隆。我认为,这种方式对用户的干扰较小,因为 ID 等不会不断变化,并且对于其他用户来说可能已经过时。无论如何,我更愿意做一个序列化列表。

关于laravel - 保存时软删除 Eloquent 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33653354/

相关文章:

php - 我该如何回应这个?

asp.net-mvc-3 - 模型变量无法识别 ASP MVC3 DropDownListFor 中的模型属性

mysql - 与 Laravel/Eloquent 的复杂关系

php - Laravel:如何从查询结果中获取模型?

php - 如何在 Laravel Eloquent ORM 中选择以数字开头的单词?

php - 具有正确 URL 的 Laravel 渲染 View

php - Illuminate\Support\MessageBag::has() 缺少参数 1

laravel - 默认创建日志文件664权限

ruby-on-rails - Rails 多态模型中记录的唯一性验证

ruby-on-rails - 从 Rails 模型中访问 c​​urrent_user?