大量にデータを更新かけたい時、配列でデータを取ってきてループで1件1件更新してしまうと、かなりの実行時間がかかってしまいます。あらかじめ定数を定義して、まとめて更新をかけることで処理速度が速くなります。
初期化処理にすごい時間がかかっていて、「いや、、これはまずい。。」と思ってソースを見てみたらこんな感じに書かれてました。
// フォームからデータ取得
$user_id = $form['user_id'];
// 更新対象データ取得
$arr_data = User::deletedFlgEqual(config('const.flg_off'))->userIdEqual($user_id)->get();
// 更新処理
if(isset($arr_data)){
foreach ($arr_data as $user_data) {
$user_data->fill([
'hoge' => 0,
'foo' => 2,
'test' => 0,
'testtest' => 0,
'sample' => 0,
'samplesample' => null,
'updated_at' => date('Y/m/d H:i:s'),
'delete_flg' => 0,
])->save();
}
}
レコードの数だけ更新処理が走ってますね。
これだと、初期化処理など大量レコードに更新かける場合パフォーマンス最悪です。
修正後のソースです。
// フォームからデータ取得
$user_id = $form['user_id'];
// 更新データ定義
$arr_data = [
'hoge' => 0,
'foo' => 2,
'test' => 0,
'testtest' => 0,
'sample' => 0,
'samplesample' => null,
'updated_at' => date('Y/m/d H:i:s'),
'delete_flg' => 0,
];
// 更新処理
DB:table('user')->userIdEqual($user_id)->update($arr_data);
決められた定数にまとめて更新をかける場合は、最初に更新データを定義して対象に対して1回だけUpdate文を走らせるようにしたほうが速くなります。
ついでに初期化処理でよく使う、delete/insertのサンプルソースも記載します。
// 物理削除
MstUser::where('user_id', $form['user_id'])->delete();
// インサート処理
$insert_array = array();
if (isset($form['new_user_id'])) {
foreach ($form['new_user_id'] as $new_id) {
$array = array(
'user_id' => $new_id,
'hoge' => $form['hoge']
);
$insert_array[] = $array;
}
MstUser::insert($insert_array);
}