😷
Laravel の Eloquent で bulk update するときに updated_at を更新しない方法
結論
users
テーブルのモデル User
に対し、 status = 0
の行の email
を null
に更新する時の例。
$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