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
        });
    }
}