【问题标题】:Laravel revisionable models with one-to-many relationship具有一对多关系的 Laravel 可修改模型
【发布时间】:2015-01-26 04:07:24
【问题描述】:

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

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

提前致谢

【问题讨论】:

    标签: php laravel revisionable


    【解决方案1】:

    我能够想出一些东西。然而,这不是最优雅的解决方案,所以如果有人能帮我清理它会很棒(尤其是 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 如何处理软删除,你可以从中提取逻辑。完全一样。

    【讨论】:

      【解决方案2】:

      为什么不用这个?

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

      【讨论】:

        猜你喜欢
        • 2016-08-25
        • 2017-07-10
        • 1970-01-01
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        相关资源
        最近更新 更多