Skip to main content

コレクションとは

Illuminate\Support\Collection クラスは、配列データを操作するための流暢なラッパーです。 PHPの標準的な配列関数を個別に呼び出す代わりに、メソッドチェーンで直感的にデータを加工できます。
コレクションはイミュータブル(不変)です。各メソッドは元のコレクションを変更せず、新しいコレクションインスタンスを返します。元のデータを保持しながら安全に操作できます。

コレクションの作成

collect() ヘルパー

最もよく使われる方法です。配列を渡してコレクションを生成します。

Collection::make()

collect() と同等です。ファサードスタイルで書きたい場合に使います。

Collection::fromJson()

JSON文字列からコレクションを作成します。外部APIのレスポンスを処理する場合に便利です。

よく使うメソッド

map — 各要素を変換する

コレクションの各要素に処理を適用し、変換された新しいコレクションを返します。

filter / reject — 条件で絞り込む

filter() は条件を満たす要素だけを残し、reject() は条件を満たす要素を除外します。
filter() 後はインデックスが歯抜けになります。values() を呼ぶと0始まりの連番に振り直されます。

first / last — 要素を1件取得する

条件を満たす最初または最後の要素を返します。

pluck — 特定のキーの値だけ取り出す

ネストした配列やモデルから特定のフィールドだけを抜き出します。

groupBy — 特定のキーでグループ化する

sortBy / sortByDesc — 並び替える

each — 各要素に処理を実行する

副作用のある処理(ログ出力、メール送信など)に使います。コレクション自体は変更しません。

flatMap — マップ後に1段階フラット化する

各要素を配列に変換し、全体を1次元に平坦化します。

reduce — 集計する

コレクション全体を1つの値に畳み込みます。
単純な合計なら sum() が使えます: $orders->sum(fn ($o) => $o['price'] * $o['quantity'])

reduceInto — オブジェクトに集計する

reduce と同様に畳み込み処理を行いますが、コールバックが返り値を返す必要がない点が異なります。既存のオブジェクトを直接ミュートするときに便利です。
reduce はコールバックの戻り値が次の $carry になるため、プリミティブな値の集計に向いています。reduceInto はオブジェクトをそのまま変更し続けるためシンプルなコードになります。
スカラーや配列に集計する場合は、コールバックで参照渡し(&)を使います。

chunk — 分割する

大きなコレクションを指定サイズに分割します。バッチ処理や画面表示で便利です。

メソッドチェーン

コレクションの真価はメソッドチェーンにあります。複数の操作をつなげて、複雑なデータ変換を1つの式で表現できます。

Eloquentとの連携

Eloquentクエリの結果は常に Illuminate\Database\Eloquent\Collection インスタンスとして返されます。 これは基本の Collection を継承しており、上記のメソッドがすべて使えます。
データベースで処理できるフィルタリングや並び替えは、コレクション操作ではなくクエリビルダ(whereorderBy など)で行いましょう。コレクションへの変換後にフィルタリングすると、不要なデータをすべてメモリに読み込んでしまいます。

Eloquent固有のコレクションメソッド

Eloquent\Collection には追加のメソッドがあります。

Lazy Collections

通常のコレクションはデータ全体をメモリに読み込みますが、LazyCollection はPHPのジェネレーターを活用し、データを1件ずつ処理します。 数万件以上の大量データを扱う場合に、メモリを節約できます。

LazyCollectionの作成

大量データのバッチ処理

cursor() はデータベースから1件ずつフェッチするため、大量のレコードを処理する際にメモリを大幅に節約できます。ただし、データベース接続は処理の完了まで維持されます。

takeskip でページング

まとめ

コレクションは配列関数よりもはるかに可読性が高くなります。
  • 通常のコレクション: 数百〜数千件程度のデータ。シンプルで直感的。
  • LazyCollection: 数万件以上の大量データ。メモリを節約したい場合。cursor() と組み合わせると効果的。
  • Eloquentの get() は通常のコレクション、cursor() は LazyCollection を返します。
最終更新日 2026年7月10日