在Laravel中使用isDirty

问题描述 投票:0回答:2

我正在控制器中使用isDirty()方法来检查是否更改了任何字段。然后,我将字段的旧数据和新数据保存在table中。代码工作正常;但是,如何optimize此代码?

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

Controller

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",
        ]);
}
laravel laravel-6
2个回答
1
投票

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

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

0
投票

我在通过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",
                ]);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.