😷

Laravel の Eloquent で bulk update するときに updated_at を更新しない方法

2024/06/13に公開

結論

users テーブルのモデル User に対し、 status = 0 の行の emailnull に更新する時の例。

$query = User::where('status', '=', 0); // 対象の検索条件
$query->getModel()->timestamps = false; // これにより updated_at の自動更新をとめる
$query->update(['email' => null]); // 更新

バッチなどで一括更新したいが、更新日を変更したくない時に使う。

別解

Eloquent ではなく Query\Builder を使う場合

updated_at は自動更新されない。

DB::table('users')
    ->where('status', '=', 0)
    ->update(['email' => null]);

対象を全部取得してループ

効率が悪いので非推奨。

$users = User::where('status', '=', 0)->get();
foreach ($users as $user) {
    $user->timestamps = false;;
    $uesr->update(['email' => null]);
}

補足

$model->timestamps = false にすると、updated_at の自動更新をしなくなる。
bulk update の場合、モデルのインスタンスがコード中に出現しないので、 getModel() で取得する必要がある。

対象を全部取得してループ のケースでは、1件ずつモデルのインスタンスが生成されているので、それぞれ設定して更新を行っている。

Discussion