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

时间:2014-11-27 14:14:40

标签: php laravel revisionable

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

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

提前致谢

2 个答案:

答案 0 :(得分:1)

我能够想出一些东西。然而,这不是最优雅的解决方案,所以如果有人帮我清理它(特别是那个没有让我困扰的话)会很棒。

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

您需要做的第一件事是在相应的表格中添加一个可以为空的日期时间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如何处理Soft Deletes,你可以从中提取逻辑。它完全一样。

答案 1 :(得分:0)

为什么不使用它?

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