- 大量のデータを取得
- 取得した大量のデータを加工しないといけない
というような場合に役に立つメソッドがchunkです。
chunkメソッドでできることは
大量のデータを小分けして取得することが可能です。
何万件ものデータを一括で取得すると、
- Out of Memoryを起こす
- レスポンスが遅くなる
- パフォーマンスが低化する
恐れがあります。
こちらを回避できるメソッドです。
例)1万件のデータを取得するとき
chunkで一度に取得する件数を100件と設定すると
100件 × 100回 でデータを取得するようになります。
記述例
基本的な記法
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
foreach ($users as $user) {
// ここに処理を記述
}
});
第1引数に1チャンクで扱うデータ数を決めます。
第2引数をクロージャとし、1チャンク内で行う処理を記述します。
条件を満たすもののみ取得する場合
$getProducts = collect();
$query->chunk(100, function ('users') use (&$getUsers) {
// ライセンス条件を満たしたuserを取得する関数
$result = $this->checkLicence($users);
// このチャンク内で取得したものを格納
$getUsers = $getUsers->merge($result);
});
このようにデータを取得すると、メモリを節約しパフォーマンスを低下させずに大量のデータを扱えるようになります。
ただし、一度に取得するデータ数の設定は多すぎても少なすぎてもパフォーマンスが低下する恐れがあります。
下記2点注意してお使いください。
一度に取得するデータ数の設定が多すぎる場合
- そもそもchunkを使う意味がなくなってしまう
一度に取得するデータ数の設定少なすぎる場合
- 1000件のデータに対してchunkの引数に1を設定した場合
- 1件 × 1000回 になるのでDBへの負担が大きくなる