背景と目的
変更前と変更後の差分を画面に表示したいとか、変更ログを残したい等。
Laravelでモデルやデータベースを更新する際の差分を取得したい場面がよく登場します。
Laravelでは差分を取得する便利メソッドが実装されてるのでご紹介します。
環境
- PHP 7.3.6
- Laravel 5.8.26
- MySQL 8.0.16
モデルの差分を取得したい時
getDirty()
メソッドを使用します。
DBの差分を取得したい時
getChanges()
メソッドを使用します。
使用例
$ php artisan tinker
tinkerを起動して動作確認します。
// ユーザーを作成する
$user = new App\User();
$user->fill([
'name'=> 'before name',
'email'=> Str::random(10) . '@example.com',
'email_verified_at' => now(),
'password' => Hash::make('secret'),
'remember_token' => Str::random(10),
]);
$user->save();
// name プロパティを変更する
$user->name = 'after name';
// 変更前のオリジナル情報
$user->getOriginal();
// 現在の情報
$user->getAttributes();
// モデルの差分
$user->isDirty(); // true
$user->getDirty();
// DBの差分 => 空
$user->wasChanged(); // false
$user->getChanges();
// * DBに保存する
$user->save();
// 現在の情報
$user->getAttributes();
// モデルの差分 => 空
$user->isDirty(); // false
$user->getDirty();
// DBの差分
$user->wasChanged(); // true
$user->getChanges();
お試し(実行ログ付き)
$ php artisan tinker
tinkerを起動して動作確認します。
// ユーザーを作成する
$user = new App\User();
=> App\User {#2959}
$user->fill([
'name'=> 'before name',
'email'=> Str::random(10) . '@example.com',
'email_verified_at' => now(),
'password' => Hash::make('secret'),
'remember_token' => Str::random(10),
]);
=> App\User {#2959
name: "before name",
email: "n2SK9GYai1@example.com",
}
$user->save();
=> true
// name プロパティを変更する
$user->name = 'after name';
=> "after name"
// 変更前のオリジナル情報
$user->getOriginal();
=> [
"name" => "before name",
"email" => "n2SK9GYai1@example.com",
"password" => "$2y$10$HENVu0klmpRp8XpQVLIG8O2jM2g1jfzfJQj8d1FzODhDso4YDssI6",
"updated_at" => "2019-06-29 21:06:04",
"created_at" => "2019-06-29 21:06:04",
"id" => 1,
]
// 現在の情報
$user->getAttributes();
=> [
"name" => "after name",
"email" => "n2SK9GYai1@example.com",
"password" => "$2y$10$HENVu0klmpRp8XpQVLIG8O2jM2g1jfzfJQj8d1FzODhDso4YDssI6",
"updated_at" => "2019-06-29 21:06:04",
"created_at" => "2019-06-29 21:06:04",
"id" => 1,
]
// モデルの差分
$user->isDirty()
=> true
$user->getDirty();
=> [
"name" => "after name",
]
// DBの差分 => 空
$user->wasChanged()
=> false
$user->getChanges();
=> []
// * DBに保存する
$user->save();
=> true
// 現在の情報
$user->getAttributes();
=> [
"name" => "after name",
"email" => "n2SK9GYai1@example.com",
"password" => "$2y$10$HENVu0klmpRp8XpQVLIG8O2jM2g1jfzfJQj8d1FzODhDso4YDssI6",
"updated_at" => "2019-06-29 21:07:51",
"created_at" => "2019-06-29 21:06:04",
"id" => 1,
]
// モデルの差分 => 空
$user->isDirty()
=> false
$user->getDirty();
=> []
// DBの差分
$user->wasChanged();
=> true
$user->getChanges();
=> [
"name" => "after name",
"updated_at" => "2019-06-29 21:07:51",
]