Laravelでデータの保存をするときに使う
update()
とsave()
は処理が異なるので注意が必要
先に結論
- update()は更新データとの差分を見てないで更新する
- save()は更新データとの差分を見て更新するか決めてる
どういうことだ
ちょっと例を添えて説明
下記2例のように
データを保存をすることがあるかと思う
update()を使った場合
App\Flight::where('id', 1)
->update(['name' => $request->name]);
save()を使った場合
$flight = App\Flight::find(1)
$flight->name = $request->name;
$flight->save();
この時、もし$request->name
が既存データと同じデータだとしたら
save()
updated_atのカラムが更新されない
update()
updated_atのカラムが更新される
そんな挙動になる/(^o^)\一緒じゃないのね
Eloquentのメソッドの中身を見てみるとわかる
vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
のsave()
を見てみると
すでにデータが存在している場合(つまりINSERTの処理の時)はperformUpdate()
というメソッドが呼ばれている
そこで以下の処理
performUpdate()の中身
// 変更されたデータを取得
$dirty = $this->getDirty();
// 変更があったら挿入の処理をするよ
if (count($dirty) > 0) {
~~ここでデータ挿入の処理~~
}
こんな感じでsave()
はデータの更新を行っているということでした。
ちなみにupdate()
は何を判定することなく、そのままデータをガツンと入れてます。
気をつけよう