1
1

More than 1 year has passed since last update.

isDirtyメソッドを使用して、変更されている項目があれば更新保存処理を行う。

Last updated at Posted at 2022-02-19

入力フォームから入力された値と、取得したモデルの値で、差異がある項目だけ保存する処理を行いたい場合は、LaravelのisDirtyメソッドという便利なものがある。

参考ドキュメント
https://readouble.com/laravel/8.x/ja/eloquent.html

参考ソースコード

<?php

$params = $request->all(); //入力フォームで入力された値を$paramsという変数に格納。

$update_target = Target::find($request->target->id); //更新対象のオブジェクトをユニークなidで取得

foreach ($params as $key => $value) {
     $update_target->$key = $value; //更新対象のオブジェクトの各フィールドの値を、入力された値に書き換えようとしている。
}


if ($update_target->isDirty()) {
    $update_target->save(); //更新対象のオブジェクトと、入力フォームから入力された値で、各フィールドごとに差異があるかisDirtyメソッドでチェックし、差異があれば保存処理を実行。
}

?>

重要なポイントとしては、$update_target->isDirty()で差異があるか、チェックする前に
foreach文で更新対象のオブジェクトを下記のような状態にしているという事です。

Target::find($request->target->id);で取得した更新対象のオブジェクトの各フィールドの値

//取得した際のオブジェクトの状態
id 1
name アップル
price 100

更新したい対象の入力値が、name:オレンジ price:500の場合、foreach文を回した際のオブジェクトの各フィールドの値は下記のようになっています。(この時点ではまだ保存はされていない)

//foreach文を回した後のオブジェクトの状態
id 1
name オレンジ
price 500

isDirty()メソッドは、取得した際のオブジェクトforeach文を回した後のオブジェクト同士を
比較して差異がある項目をチェックしてくれるというメソッドです。

私の場合は、foreach文を回した後に、オブジェクトが上記のようにDBに保存する前の状態になっているというイメージが掴めていなかったので、isDirty()メソッドの挙動に対する理解に少し詰まりました。

今回、自分用のメモのような形でこの記事を執筆させて頂きましたので皆様の理解に少しでも手助けになればと思います。

1
1
1

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
1
1