Использование isDirty в Laravel - PullRequest
0 голосов
/ 09 ноября 2019

Я использую метод isDirty() в моем контроллере, чтобы проверить, изменилось ли какое-либо поле. Затем я сохраняю старые данные поля и новые данные в table. Код работает нормально;однако, как я могу optimize этот код?

Используя приведенный ниже код, мне придется снова и снова писать каждое имя поля. Если request->all() имеет 20 полей, но я хочу проверить шесть полей, если они изменены, как я могу передать только 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",
        ]);
}

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Вы можете установить список полей, которые вы хотите проверять, затем вы можете пройтись по грязным полям и построить записи вставки.

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 голосов
/ 09 ноября 2019

Я попробовал следующий код после получения идеи от 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",
                ]);
        }
    }
...