use*_*325 7 php laravel revisionable
可修改是否可以跟踪一对多关系的变化?例如:
型号:用户.型号:帖子.用户模型使用Venturecraft\Revisionable\RevisionableTrait; 并且与帖子有很多关系.如果添加或更新帖子,是否可以通过该帖子所属的用户下的可修改版本进行跟踪?
提前致谢
我想出了一些办法。然而,这不是最优雅的解决方案,所以如果有人能帮助我清理这个问题,那就太好了(尤其是未设置的问题困扰着我)。
我的解决方案将在模型所属的表中创建重复项。我不知道这是否是你想要的
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 如何处理软删除,您可以从中提取逻辑。完全一样。