gpt4 book ai didi

php - 跟踪相关模型的数据库更改...... Laravel 5.1

转载 作者:可可西里 更新时间:2023-11-01 08:11:26 29 4
gpt4 key购买 nike

我们正在尝试在属性级别检测 Laravel 相关模型的更改,因为我们必须保留通过应用程序进行的所有更改的审计跟踪。

对于与任何其他模型无关的单个模型,我们可以通过 isDirty 方法在 Eloquent 模型上跟踪更改,但是我们无法跟踪相关 Eloquent 模型上的更改。 isDirty 不适用于相关模型属性。有人可以帮我们解决这个问题吗?

原始问题的更新:

实际上,我们正在尝试跟踪数据透视表上的更改,该数据透视表具有在其上定义的额外属性。 IsDirty 方法不适用于数据透视表中定义的那些额外属性。

谢谢

最佳答案

据我了解你的问题,它可以通过模型事件和当前和关系模型的某种额外代码来实现。

Laravel 模型事件
如果你不想使用任何额外的东西,你可以只使用 Laravel 模型事件(实际上 Ardent 被包裹在钩子(Hook)中)。查看文档 http://laravel.com/docs/5.1/eloquent#events

Eloquent models fire several events, allowing you to hook into various points in the model's lifecycle using the following methods: creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored.

Whenever a new item is saved for the first time, the creating and created events will fire. If an item is not new and the save method is called, the updating / updated events will fire. In both cases, the saving / saved events will fire.

If false is returned from the creating, updating, saving, or deleting events, the action will be cancelled:

最后,关于您的问题,您可以通过多种方式利用上述方法,但最明显的是,您可以将其与 Eloquent 模型的 getDirty() api docs here 结合(或不结合)方法和getRelation() api docs here方法

例如,它将与保存事件一起使用。

Model::saving(function($model){
foreach($model->getDirty() as $attribute => $value){
$original= $model->getOriginal($attribute);
echo "Changed";
}
$relations = $model->getRelations();
foreach($relations as $relation){
$relation_model = getRelation($relation);
foreach($relation_model->getDirty() as $attribute => $value){
$original= $relation_model->getOriginal($attribute);
echo "Relation Changed";
}
}
return true; //if false the model wont save!
});

另一种想法可能对您有所帮助。当你保存

save() 将检查模型中的某些内容是否已更改。如果没有,它将不会运行数据库查询。

这是 Illuminate\Database\Eloquent\Model@performUpdate 中的相关代码部分:

protected function performUpdate(Builder $query, array $options = [])
{
$dirty = $this->getDirty();

if (count($dirty) > 0)
{
// runs update query
}

return true;
}

getDirty() 方法只是将当前属性与创建模型时保存在original 中的副本进行比较。这是在 syncOriginal() 方法中完成的:

public function __construct(array $attributes = array())
{
$this->bootIfNotBooted();

$this->syncOriginal();

$this->fill($attributes);
}

public function syncOriginal()
{
$this->original = $this->attributes;

return $this;
}

检查模型是否脏 isDirty():

if($user->isDirty()){
// changes have been made
}

或者检查某个属性:

if($user->isDirty('price')){
// price has changed
}

我没有检查这段代码,但希望可以作为您的想法的答案,如果您对处理此类需求有任何困惑或需要优化或更改的内容,请告诉我。

关于php - 跟踪相关模型的数据库更改...... Laravel 5.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32563383/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com