在 Laravel 中使用 isDirty

Using isDirty in Laravel

我在我的控制器中使用 isDirty() 方法来检查是否有任何字段被更改。然后我将一个字段的旧数据和新数据保存在table中。代码运行良好;但是,我如何 optimize 这段代码?

通过使用下面的代码,我将不得不一遍又一遍地编写每个字段名称。如果request->all()有20个字段,但是我想检查6个字段是否被修改,下面的代码如何只传6 fields,不重复?

控制器

if ($teacher->isDirty('field1')) {
    $new_data = $teacher->field1;
    $old_data = $teacher->getOriginal('field1');

    DB::table('teacher_logs')->insert(
        [
            'user_id' => $user->id,
            'teacher_id' => $teacher->id,
            'old_value' => $old_data,
            'new_value' => $new_data,
            'column_changed' => "First Name",
        ]);
}

我在评论中得到 lagbox 的想法后尝试了以下代码,并且我找到了解决问题的方法。

    $dirty = $teacher->getDirty('field1','field2','field3');
    foreach ($dirty as $field => $newdata)
    {
        $olddata = $teacher->getOriginal($field);
        if ($olddata != $newdata)
        {
            DB::table('teacher_logs')->insert(
                ['user_id' => $user->id,
                    'teacher_id' => $teacher->id,
                    'old_value' => $olddata,
                    'new_value' => $newdata,
                    'column_changed' => "changed",
                ]);
        }
    }

您可以设置要检查哪些字段的列表,然后可以遍历脏字段并构建插入记录。

use Illuminate\Support\Arr;

...

$fields = [
    'field1' => 'First Name',
    'field2' => '...',
    ...
];

$dirtied = Arr::only($teacher->getDirty(), array_keys($fields));

$inserts = [];

foreach ($dirtied as $key => $value) {
    $inserts[] = [
        'user_id' => $user->id,
        'teacher_id' => $teacher->id,
        'old_value' => $teacher->getOriginal($key),
        'new_value' => $value,
        'column_changed' => $fields[$key];
    ];
}

DB::table(...)->insert($inserts);