【发布时间】:2015-01-26 04:07:24
【问题描述】:
revisionable 是否可以跟踪一对多关系的更改?例如:
型号:用户。 模型:帖子。用户模型使用 Venturecraft\Revisionable\RevisionableTrait;并与 Posts 有 hasMany 关系。如果添加或更新了帖子,是否可以通过该帖子所属的用户下的可修订来跟踪?
提前致谢
【问题讨论】:
标签: php laravel revisionable
revisionable 是否可以跟踪一对多关系的更改?例如:
型号:用户。 模型:帖子。用户模型使用 Venturecraft\Revisionable\RevisionableTrait;并与 Posts 有 hasMany 关系。如果添加或更新了帖子,是否可以通过该帖子所属的用户下的可修订来跟踪?
提前致谢
【问题讨论】:
标签: php laravel revisionable
我能够想出一些东西。然而,这不是最优雅的解决方案,所以如果有人能帮我清理它会很棒(尤其是 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;
});
【讨论】: