Php 雄辩-保存()模型后比较属性更改
我正在我的应用程序中构建一个审计系统,我想比较Php 雄辩-保存()模型后比较属性更改,php,laravel,eloquent,Php,Laravel,Eloquent,我正在我的应用程序中构建一个审计系统,我想比较save()方法之后一个雄辩的模型属性更改。下面是我需要的一个例子: $person = Person::find(1); //Original data: $person->name -> 'Original name', $person->age -> 22 $person->name = 'A new name'; $person->age = 23; $person->save(); //At th
save()
方法之后一个雄辩的模型属性更改。下面是我需要的一个例子:
$person = Person::find(1); //Original data: $person->name -> 'Original name', $person->age -> 22
$person->name = 'A new name';
$person->age = 23;
$person->save();
//At this point, I need to get an array like this (only with the attributes that have changed):
[
'age' => ['old' => 22, 'new' => 23],
'name' => ['old' => 'Original name', 'new' => 'A new name']
]
我知道Eloquent已经有了一些函数,比如isDirty()
、getDirty()
和getChanges()
,但是这些方法只返回新值,我需要将旧值和新值存储在审计表中
是否有任何方法可以做到这一点,而无需“克隆”我的变量,然后进行比较以获得更改?在保存模型之前,您可以访问原始(旧)属性值,如:
$person->original
此外,您还可以调用:$person->getChanges()
以获取所有已更改的属性。在使用Save()
函数之前以及在覆盖第2行和第3行上的变量之前,您可以通过以下操作获取旧数据:
$oldName = $person->name;
$oldAge = $person->age;
然后,保存后,您可以在数组中插入值,如下所示:
$values = array(
"oldName" => $oldName,
"newName" => "New Name",
"oldAge" => $oldAge,
"newAge" => "New Age",
);
因此,您可以通过执行以下操作从数组中获取值:
echo $values["oldName"];
echo $values["newAge"];
...
在进行更改之前,可以克隆新检索的模型。 类似于
$person = Person::find(1);
$original_person = cone $person;
// update the person object
// ...
$person->save();
您可以继续这样构造阵列:
[
'age' => ['old' => $original_person->age, 'new' => $person->age],
'name' => ['old' => $original_person->name, 'new' => $person->name]
]
您可以在模型类的updated()引导函数中执行此操作
class Mymodel extends Model
{
public static function boot()
{
parent::boot();
self::updated(function ($model) {
var_dump($model->original);
var_dump($model->getChanges());
// Traverse the changed array and save with original values
});
}
}