コレクションとは
Illuminate\Support\Collection クラスは、配列データを操作するための流暢なラッパーです。
PHPの標準的な配列関数を個別に呼び出す代わりに、メソッドチェーンで直感的にデータを加工できます。
コレクションはイミュータブル(不変)です。各メソッドは元のコレクションを変更せず、新しいコレクションインスタンスを返します。元のデータを保持しながら安全に操作できます。
コレクションの作成
collect() ヘルパー
最もよく使われる方法です。配列を渡してコレクションを生成します。
Collection::make()
collect() と同等です。ファサードスタイルで書きたい場合に使います。
Collection::fromJson()
JSON文字列からコレクションを作成します。外部APIのレスポンスを処理する場合に便利です。
よく使うメソッド
map — 各要素を変換する
コレクションの各要素に処理を適用し、変換された新しいコレクションを返します。
filter / reject — 条件で絞り込む
filter() は条件を満たす要素だけを残し、reject() は条件を満たす要素を除外します。
first / last — 要素を1件取得する
条件を満たす最初または最後の要素を返します。
pluck — 特定のキーの値だけ取り出す
ネストした配列やモデルから特定のフィールドだけを抜き出します。
groupBy — 特定のキーでグループ化する
sortBy / sortByDesc — 並び替える
each — 各要素に処理を実行する
副作用のある処理(ログ出力、メール送信など)に使います。コレクション自体は変更しません。
flatMap — マップ後に1段階フラット化する
各要素を配列に変換し、全体を1次元に平坦化します。
reduce — 集計する
コレクション全体を1つの値に畳み込みます。
reduceInto — オブジェクトに集計する
reduce と同様に畳み込み処理を行いますが、コールバックが返り値を返す必要がない点が異なります。既存のオブジェクトを直接ミュートするときに便利です。
&)を使います。
chunk — 分割する
大きなコレクションを指定サイズに分割します。バッチ処理や画面表示で便利です。
メソッドチェーン
コレクションの真価はメソッドチェーンにあります。複数の操作をつなげて、複雑なデータ変換を1つの式で表現できます。Eloquentとの連携
Eloquentクエリの結果は常にIlluminate\Database\Eloquent\Collection インスタンスとして返されます。
これは基本の Collection を継承しており、上記のメソッドがすべて使えます。
Eloquent固有のコレクションメソッド
Eloquent\Collection には追加のメソッドがあります。
Lazy Collections
通常のコレクションはデータ全体をメモリに読み込みますが、LazyCollection はPHPのジェネレーターを活用し、データを1件ずつ処理します。
数万件以上の大量データを扱う場合に、メモリを節約できます。
LazyCollectionの作成
大量データのバッチ処理
cursor() はデータベースから1件ずつフェッチするため、大量のレコードを処理する際にメモリを大幅に節約できます。ただし、データベース接続は処理の完了まで維持されます。take と skip でページング
まとめ
よく使うメソッドまとめ
よく使うメソッドまとめ
コレクション vs 配列関数
コレクション vs 配列関数
コレクションは配列関数よりもはるかに可読性が高くなります。
通常のコレクション vs LazyCollection
通常のコレクション vs LazyCollection
- 通常のコレクション: 数百〜数千件程度のデータ。シンプルで直感的。
- LazyCollection: 数万件以上の大量データ。メモリを節約したい場合。
cursor()と組み合わせると効果的。 - Eloquentの
get()は通常のコレクション、cursor()は LazyCollection を返します。