Laravel Collectionとは?基本の使い方と主要メソッドを初心者向けに解説

基本文法・構文ガイド

「Laravel Collection」で検索すると公式ドキュメントや個別メソッドの解説記事は多く見つかりますが、Collectionが何者で配列と何が違うのか、Eloquentとどう関係するのかを一通り押さえられる記事は意外と少ないものです。この記事では、Laravel Collectionの基本概念から配列との違い、作成方法、Eloquentとの関係、実践的な活用例までを、実際にLaravel 12環境で動作確認したコードとあわせて解説します。

Laravel Collectionとは?

Laravel Collectionとは、Illuminate\Support\Collectionクラスが提供する、配列をオブジェクト指向的に扱うためのラッパーです。公式ドキュメントでは「fluent interface(流れるようなインターフェース)」と紹介されており、mapfilterなどのメソッドをチェーンでつなげて、複雑なデータ操作を短いコードで表現できます。

$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_maparray_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);

要素の取得

firstlastgetなど、要素を取得するメソッドも豊富です。

$first = $collection->first();
$last = $collection->last();
$specific = $collection->get(2);

条件によるフィルタリング

filterwhereで条件を満たす要素だけを絞り込めます。実務では配列の連想キーを条件にする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を継承したサブクラスです。そのためmapfilterといった基本メソッドはそのまま使え、加えてfindmodelKeysなど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メソッド一覧

個別メソッドの詳しい引数・戻り値・注意点は、それぞれの解説記事にまとめています。

作成・変換

取得・抽出

フィルタリング・検索

変換・加工

グループ化・集計

ソート・整形

その他

よくある質問

Laravel CollectionとEloquent Collectionの違いは?

Eloquentのクエリ結果が返すIlluminate\Database\Eloquent\Collectionは、Illuminate\Support\Collectionを継承したサブクラスです。基本メソッド(map / filter / pluckなど)は共通で使え、そこにfindmodelKeysなど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あたりの主要メソッドを押さえ、必要になったタイミングで個別メソッドの解説記事を参照する、という使い方がおすすめです。

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする

コメント