Laravelで複合主キーのテーブルのデータをchunkで読み込む方法を調査する機会があったため忘備録として記録に残そうと思います。
IDカラムがないテーブルでchunkを使いたい
IDカラムが存在しないテーブルのため、chunkByIdが使えません。
また、複合主キーのためchunkを使う場合に少し工夫が必要です。
クエリビルダを使い、主キーとなる複数カラムで明示的にorderByを指定してchunkメソッドを利用します。
データの重複や抜け漏れを防ぐため、全ての主キーでorderByを指定します。
DB::table(‘table_name’)
->orderBy(‘key1’)
->orderBy(‘key2’)
// 1000件ずつデータを取得
->chunk(1000, function ($rows) {
Foreach ($rows as $row) {
// データ処理
}
});
注意点
処理の途中でテーブルにデータが追加、更新、削除された場合に、OrderByでの並び順に影響が出ることで、想定外のデータが取得されたり、一部のレコードを2重に処理してしまうなどの問題が起きる可能性もあるので注意します。
サロゲートキー設計
システム的にユニークな値になるようにDB設定等にてオートインクリメントで連番を設定している、テーブルのPKのことをサロゲートキー(代理キー)と呼びます。
このPKに関してですが、あくまでユニークになる連番なので、業務的は意味を持つ値ではありません。
こちらの設計であれば、複合主キーに対応するための工数が減るので良さそうです。
参考
告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。
みなさまからのご応募をお待ちしております。