具有一对多关系的 Laravel可修订模型


Laravel revisionable models with one-to-many relationship

修订版是否可以跟踪对一对多关系的更改?例如:

型号:用户。模型:帖子。用户模型使用Venturecraft''Revisionable''RevisionableTrait;并且与帖子有很多关系。如果添加或更新了帖子,是否可以在帖子所属的用户下通过可修订进行跟踪?

提前致谢

我能够想出一些东西。然而,这不是最优雅的解决方案,所以如果有人能帮我清理这个问题,那就太好了(尤其是未设置的那个困扰着我)。

我的解决方案将在模型所属的表中创建重复项。我不知道这是否是你想要的

您需要做的第一件事是在相应的表中添加可为空的日期时间revision_at列。

特征本身非常简单。我们利用模型boot()方法来注册模型updating事件。每当模型即将更新时,它都会触发。这正是我们所需要的,因为我们不希望在第一次创建模型时进行修订。

<?php
trait RevisionableTrait {
    public static function boot()
    {
        parent::boot();
        static::updating(function( $model ){
            // Grab the original Model and unset the id
            // from it, so that we don't get duplicate
            // entries when we create a new model.
            $attributes = $model->getOriginal();
            unset( $attributes['id'] );
            // Next we need to add the date the revision 
            // was created
            $attributes['revision_at'] = new DateTime();

            $revision = new static($attributes);
            $revision->save();
        });

    }
}

我们在这里唯一要做的就是在分配新字段之前获取原始模型,取消设置 id 以确保我们不会创建重复条目,设置 revision_at 字段的当前时间并保存模型。

基本上就是这样。

这可以通过帖子所属的用户下的可修订进行跟踪吗?

这是自动完成的,因为新的修订模型仍然属于相应的用户,

如果要对其进行微调,可以创建一个专用的修订表,其中存储了对模型的引用。但是,存储属性可能会变得有点困难(也许您可以序列化存储它们)。

另一个可能的改进是修改特征中模型的 getter 方法。例如,让all()仅返回没有修订的模型。然后添加一个withRevisions()方法来抓取它们。如果您查看 Laravel 如何处理软删除,则可以从中提取逻辑。这是完全一样的。

为什么不使用它呢?

$user = User::first();
$user->posts->map(function($post) {
    return $post->revisionHistory;
});