🐈

LaravelのCollectionクラス:便利な使い方とテクニック集

2025/03/04に公開

Laravelを使い始めた方にとって、「コレクション」という概念は少し難しく感じるかもしれません。しかし、このコレクションは実はLaravelの中でも特に強力な機能の一つです。今回は、Laravel初心者の方でも理解しやすいように、Eloquentのget()メソッドから返されるコレクションの使い方とテクニックを紹介します。

コレクションとは?

Laravelのコレクションは単なる配列ではなく、データを扱うための多くの便利なメソッドを持つラッパークラスです。Illuminate\Database\Eloquent\Collectionクラスのインスタンスとして提供され、データ操作を流暢に行うことができます。

便利なコレクションメソッド

1. データの絞り込み

// activeが真のユーザーだけを取得
$activeUsers = User::get()->where('active', true);

// 年齢が30歳以上のユーザーを取得
$adultUsers = User::get()->filter(function ($user) {
    return $user->age >= 30;
});

2. データの変換

// 名前だけの配列を取得
$names = User::get()->pluck('name');

// IDをキー、名前を値とする連想配列に変換
$idNameMap = User::get()->pluck('name', 'id');

// 各ユーザーの名前を大文字に変換
$uppercaseNames = User::get()->map(function ($user) {
    return strtoupper($user->name);
});

3. データの集計

// ユーザーの合計数
$count = User::get()->count();

// 年齢の合計
$totalAge = User::get()->sum('age');

// 年齢の平均
$averageAge = User::get()->avg('age');

// 最大年齢
$maxAge = User::get()->max('age');

4. データのグループ化

// 役職ごとにユーザーをグループ化
$usersByRole = User::get()->groupBy('role');

// 年代ごとにグループ化
$usersByAgeGroup = User::get()->groupBy(function ($user) {
    return floor($user->age / 10) * 10;
});

5. データの検索

// 条件に一致する最初のユーザーを取得
$admin = User::get()->firstWhere('role', 'admin');

// IDが5のユーザーを検索
$user = User::get()->find(5);

// 条件に一致するデータが含まれているか確認
$hasAdmin = User::get()->contains('role', 'admin');

6. コレクションのチェーンメソッド

コレクションの大きな特徴は、メソッドをチェーンさせて複雑な操作を簡潔に書けることです。

$result = User::get()
    ->where('active', true)          // アクティブユーザーのみ
    ->sortByDesc('last_login')       // 最終ログイン日時の降順
    ->take(10)                       // 上位10件
    ->map(function ($user) {         // 名前とメールだけの配列に変換
        return [
            'name' => $user->name,
            'email' => $user->email
        ];
    });

7. コレクションと配列の相互変換

// コレクションを配列に変換
$array = User::get()->toArray();

// コレクションをJSONに変換
$json = User::get()->toJson();

// 配列からコレクションを作成
$collection = collect([1, 2, 3, 4, 5]);

8. コレクションの分割と結合

// コレクションを2つに分割
[$lowIds, $highIds] = User::get()->partition(function ($user) {
    return $user->id <= 100;
});

// 複数のコレクションを結合
$allUsers = $adminUsers->concat($regularUsers);

// コレクションをチャンク(塊)に分割
$chunks = User::get()->chunk(10); // 10ユーザーずつのグループに分割

9. ページネーション連携

// ページネーションされたデータからコレクションを取得
$users = User::paginate(15);
$collection = $users->getCollection();

10. マクロで独自メソッドを追加

Laravelでは、コレクションに独自のメソッドを追加することもできます。

// AppServiceProviderのbootメソッド内で定義
Collection::macro('toSelect', function () {
    return $this->mapWithKeys(function ($item) {
        return [$item->id => $item->name];
    });
});

// 使用例:セレクトボックス用の配列を簡単に作成
$selectOptions = User::get()->toSelect();

まとめ

Laravelのコレクションは、配列操作を強力かつエレガントに行うための素晴らしいツールです。従来のPHPの配列関数よりも直感的で、メソッドチェーンによって複雑な操作も簡潔に記述できます。

コレクションの概念に慣れると、Laravelでのデータ操作が非常に効率的になります。まずは基本的なメソッドから使ってみて、徐々にレパートリーを増やしていくことをお勧めします。

より詳細な情報は、Laravel公式ドキュメントを参照してください。

Discussion