Eloquent - 比较 save() 模型后的属性变化

我正在我的应用程序中构建一个审核系统,并且我想比较save()方法后 Eloquent 模型属性的变化。这是我需要的示例:


$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(),但是这个方法只返回新值,我需要将旧值和新值存储在我的审计表中。


有没有什么方法可以做到这一点,而不需要“克隆”我的变量,然后比较它以获取更改?


慕雪6442864
浏览 87回答 4
4回答

叮当猫咪

在保存模型之前,您可以访问原始(旧)属性值,例如: $person->original。此外,您可以调用:$person->getChanges()来获取所有更改的属性。

慕哥6287543

在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        });    }}
打开App,查看更多内容
随时随地看视频慕课网APP