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

use*_*325 7 php laravel revisionable

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

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

提前致谢

thp*_*hpl 2

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

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

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

这个特性本身非常简单。我们使用 modelsboot()方法来注册 modelsupdating事件。每当模型即将更新时它就会触发。这正是我们所需要的,因为我们不想在第一次创建模型时进行修改。

<?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();

        });


    }

}
Run Code Online (Sandbox Code Playgroud)

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

基本上就是这样。

可以通过帖子所属用户下的可修改来跟踪吗?

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

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

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