LoginSignup
40
37

More than 3 years have passed since last update.

Laravel5.8 EloquentやDBの差分を取得する

Last updated at Posted at 2019-06-29

背景と目的

変更前と変更後の差分を画面に表示したいとか、変更ログを残したい等。
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",
   ]

参考

40
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
37