Laravel: getOriginal и getChanges

Функция getChanges() возвращает измененные поля модели после сохранения:


public function testGetChanges()
{
        AnyModel::create([
            'name' => 'Test',
            'content' => 'any text ...',
        ]);
        $model = AnyModel::first();
        $model->name = 'New test';
        $model->save();
        $this->assertEquals($model->getChanges(), ['name' => 'New test']);

После следующего обновления getChanges удаляет предыдущие изменения и выводит новые:


        $model->name = 'Test2';
        $model->update();
        $this->assertEquals($model->getChanges(), ['name' => 'Test2']);
}

Функция getOriginal() возвращает все поля в неизменном виде до сохранения:


public function testGetOriginal()
{
        AnyModel::create([
            'name' => 'Test',
            'content' => 'any text ...',
        ]);
        $model = AnyModel::first();
        $model->name = 'New test';
        $this->assertEquals($model->getOriginal('name'), 'Test');
        $model->save();

После сохранения метод getOriginal возвращает новые значения:


        $this->assertEquals($model->getOriginal('name'), 'New test');
}

Метод getOriginal() по умолчанию возвращает все поля модели, если вам нужно только одно, используйте getOriginal('field_name'). Для работы только с измененными полями можно сделать примерно так:


        foreach ($model->getChanges() as $key => $value) {
            $originals[$key] = $model->getOriginal($key);
        }

В итоге массив $originals будет содержать оригинальные значения измененных полей. Разумеется, это работает только до сохранения.

04.10.2019