可修订是否可以跟踪一对多关系的更改?例如:
型号:用户。模型:帖子。用户模型使用 Venturecraft\Revisionable\RevisionableTrait;并与 Posts 有 hasMany 关系。如果添加或更新了帖子,是否可以通过该帖子所属的用户下的可修订来跟踪?
提前致谢
可修订是否可以跟踪一对多关系的更改?例如:
型号:用户。模型:帖子。用户模型使用 Venturecraft\Revisionable\RevisionableTrait;并与 Posts 有 hasMany 关系。如果添加或更新了帖子,是否可以通过该帖子所属的用户下的可修订来跟踪?
提前致谢
我能够想出一些东西。然而,这不是最优雅的解决方案,所以如果有人能帮我清理它会很棒(尤其是 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 如何处理软删除,你可以从中提取逻辑。完全一样。
为什么不使用这个?
$user = User::first();
$user->posts->map(function($post) {
return $post->revisionHistory;
});