「Laravel Collection」で検索すると公式ドキュメントや個別メソッドの解説記事は多く見つかりますが、Collectionが何者で配列と何が違うのか、Eloquentとどう関係するのかを一通り押さえられる記事は意外と少ないものです。この記事では、Laravel Collectionの基本概念から配列との違い、作成方法、Eloquentとの関係、実践的な活用例までを、実際にLaravel 12環境で動作確認したコードとあわせて解説します。
Laravel Collectionとは?
Laravel Collectionとは、Illuminate\Support\Collectionクラスが提供する、配列をオブジェクト指向的に扱うためのラッパーです。公式ドキュメントでは「fluent interface(流れるようなインターフェース)」と紹介されており、mapやfilterなどのメソッドをチェーンでつなげて、複雑なデータ操作を短いコードで表現できます。
$collection = collect([1, 2, 3, 4, 5]);
$result = $collection
->filter(fn ($n) => $n % 2 === 0)
->map(fn ($n) => $n * 10);
$result->all(); // [1 => 20, 3 => 40]
配列とCollectionの違い
PHPの配列はarray_mapやarray_filterのような関数に配列を渡す形になりますが、Collectionはオブジェクトそのものがメソッドを持つため、処理をメソッドチェーンで続けて書けます。実際に配列に対してCollectionのメソッドを呼ぶとエラーになることも確認できます。
$array = [1, 2, 3];
$array->map(fn ($n) => $n); // Error: Call to a member function map() on array
| 観点 | 配列(array) | Collection |
|---|---|---|
| 操作方法 | array_map()などの関数に渡す |
オブジェクトのメソッドとして呼ぶ |
| メソッドチェーン | 不可(都度変数に代入が必要) | 可能(->map()->filter()->sort()のように連結) |
| Eloquentとの関係 | そのままでは連携なし | クエリ結果はCollectionとして返る |
| 実装 | PHPの言語機能 | Countable / IteratorAggregate / Arrayableを実装したクラス |
Collectionの作成方法
もっとも基本的な作り方はcollectヘルパー関数です。配列や反復可能な値を渡すと、Collectionインスタンスに変換されます。
$collection = collect([1, 2, 3, 4, 5]);
自分でCollectionを作らなくても、Eloquentのクエリ結果は自動的にCollectionとして返ってきます。DB::table()->get()やEloquentモデルのall() / get()を使えば、その時点でCollectionのメソッドがそのまま使えます。
$users = DB::table('users')->get(); // Illuminate\Support\Collection
$users = User::all(); // Illuminate\Database\Eloquent\Collection
基本操作
要素の追加・削除
末尾に要素を追加するにはpush、条件に合う要素を除外するにはrejectを使います。個別の使い方はpush — コレクション末尾に要素を追加で解説しています。
$collection->push(6);
$filtered = $collection->reject(fn ($value) => $value > 3);
要素の取得
first・last・getなど、要素を取得するメソッドも豊富です。
$first = $collection->first();
$last = $collection->last();
$specific = $collection->get(2);
条件によるフィルタリング
filterやwhereで条件を満たす要素だけを絞り込めます。実務では配列の連想キーを条件にするwhere / whereInを使う場面も多くあります。
$even = $collection->filter(fn ($value) => $value % 2 === 0);
$admins = collect([
['id' => 1, 'role' => 'admin'],
['id' => 2, 'role' => 'user'],
['id' => 3, 'role' => 'admin'],
])->whereIn('role', ['admin'])->pluck('id');
$admins->all(); // [0 => 1, 2 => 3]
Eloquentとの関係
Eloquentのクエリ結果が返すIlluminate\Database\Eloquent\Collectionは、Illuminate\Support\Collectionを継承したサブクラスです。そのためmapやfilterといった基本メソッドはそのまま使え、加えてfindやmodelKeysなどEloquent固有のメソッドも追加されています。通常のCollectionにfindを使うと「Call to undefined method」エラーになるので注意してください。
get_parent_class(\Illuminate\Database\Eloquent\Collection::class);
// "Illuminate\Support\Collection"
つまり「クエリビルダ・Eloquentから取得したデータをどう加工するか」で悩んだときは、まずCollectionのメソッド一覧を確認するのが近道です。
実践的な活用例
フォーム入力値のクリーニング
リクエストの入力値をCollectionに変換すれば、前後の空白除去や空値の除外をチェーンでまとめて書けます。
$cleaned = collect($request->all())
->map(fn ($value, $key) => is_string($value) ? trim($value) : $value)
->filter(); // 空文字やnullを除外
Bladeテンプレートでの利用
コントローラーから渡したCollectionは、Bladeの中でもそのままメソッドを使って絞り込めます。
<ul>
@foreach ($users->filter(fn ($user) => $user->is_active) as $user)
<li>{{ $user->name }} - {{ $user->email }}</li>
@endforeach
</ul>
APIレスポンスの整形
mapで必要な項目だけを抜き出し、そのままtoJsonやcontrollerのreturnに渡せます。
$response = $users->map(fn ($user) => [
'id' => $user->id,
'name' => strtoupper($user->name),
'email' => strtolower($user->email),
]);
return $response; // JsonResponseとして自動でJSON化される
グループ化と集計
groupByでグループ化してからcountやmapを組み合わせると、集計処理も数行で書けます。詳しい引数はgroupBy — キーやコールバックで要素をグループ化するを参照してください。
$grouped = collect([
['name' => 'Alice', 'dept' => 'Sales'],
['name' => 'Bob', 'dept' => 'Sales'],
['name' => 'Charlie', 'dept' => 'Dev'],
])->groupBy('dept')->map->count();
$grouped->all(); // ['Sales' => 2, 'Dev' => 1]
よく使うCollectionメソッド一覧
個別メソッドの詳しい引数・戻り値・注意点は、それぞれの解説記事にまとめています。
作成・変換
取得・抽出
- pluck — コレクション/Eloquentで指定キーの値だけを抜き出す
- last — コレクションの最後の要素を取得
- take — 先頭(または末尾)から指定件数を取り出す
- only — 指定キーだけを抜き出す
フィルタリング・検索
- filter — コレクション要素を条件で抽出する
- where — 条件で要素を抽出
- whereIn — 指定キーの値が配列に含まれる要素だけを抽出
- contains — コレクションに値/条件が含まれるか判定する
- search — 最初に一致した要素のキーを返す
変換・加工
グループ化・集計
ソート・整形
その他
よくある質問
Laravel CollectionとEloquent Collectionの違いは?
Eloquentのクエリ結果が返すIlluminate\Database\Eloquent\Collectionは、Illuminate\Support\Collectionを継承したサブクラスです。基本メソッド(map / filter / pluckなど)は共通で使え、そこにfindやmodelKeysなどEloquentモデル特有のメソッドが追加されています。
Collectionを配列に戻すにはどうすればいい?
all()とtoArray()のどちらでも変換できますが、挙動に違いがあります。all()は内部の要素をそのまま返すため、要素にCollectionやEloquentモデルが含まれていればオブジェクトのまま残ります。一方toArray()は、内部の要素も再帰的に配列へ変換します。
$outer = collect(['nested' => collect([1, 2, 3])]);
$outer->all()['nested']; // Illuminate\Support\Collection のまま
$outer->toArray()['nested']; // [1, 2, 3] という配列に変換される
配列のままではダメなの?
件数が少なく単純な処理であれば配列のままでも問題ありません。ただし、複数の条件でフィルタしてからソートし、さらに集計する、といった処理を組み合わせる場合は、メソッドチェーンで書けるCollectionの方が可読性が高くなります。
まとめ
Laravel Collectionは、配列を扱いやすくするだけでなく、Eloquentのクエリ結果を直接操作できる点で、Laravel開発の中心的な存在です。まずはcollectで作成する基本と、map / filter / pluckあたりの主要メソッドを押さえ、必要になったタイミングで個別メソッドの解説記事を参照する、という使い方がおすすめです。

コメント