7

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

型号:用户。模型:帖子。用户模型使用 Venturecraft\Revisionable\RevisionableTrait;并与 Posts 有 hasMany 关系。如果添加或更新了帖子,是否可以通过该帖子所属的用户下的可修订来跟踪?

提前致谢

4

2 回答 2

2

我能够想出一些东西。然而,这不是最优雅的解决方案,所以如果有人能帮我清理它会很棒(尤其是 unset 困扰着我)。

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

您需要做的第一件事是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字段的当前时间并保存模型。

基本上就是这样。

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

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

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

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

于 2014-11-27T15:37:37.120 回答
1

为什么不使用这个?

$user = User::first();
$user->posts->map(function($post) {
    return $post->revisionHistory;
});
于 2019-02-28T12:39:40.390 回答