入力フォームから入力された値と、取得したモデルの値で、差異がある項目だけ保存する処理を行いたい場合は、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()メソッドの挙動に対する理解に少し詰まりました。
今回、自分用のメモのような形でこの記事を執筆させて頂きましたので皆様の理解に少しでも手助けになればと思います。