コレクション

記事の内容

概要

コレクションは、配列データを便利に操作できるラッパーで多彩なメソッドを提供します。
※メソッドも豊富でメソッドチェーン可能

メソッドチェーンとは、複数のメソッドを連続して呼び出すテクニック

【ファイル先】app/Http/Controllers/UserController.php

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index()
    {
        // メソッドチェーンを使ったデータの取得と操作
        $users = User::where('active', true) // アクティブなユーザーを絞り込み
            ->orderBy('created_at', 'desc') // 登録日の新しい順に並べ替え
            ->take(10) // 最初の10件を取得
            ->get() // 結果をコレクションとして取得
            ->map(function ($user) { // 各ユーザーの名前を大文字に変換
                return [
                    'name' => strtoupper($user->name),
                    'email' => $user->email,
                ];
            });

        return view('users.index', ['users' => $users]);
    }
}

生成・基本操作

collect

配列やオブジェクトをコレクションに変換します。
※配列やオブジェクトに対して、コレクションの便利なメソッドを使いたい場合

$collection = collect([1, 2, 3, 4, 5]);

all

コレクションを配列として全て取得します。

$collection = collect([1, 2, 3, 4, 5]);

$array = $collection->all();
// $array中身: [1, 2, 3, 4, 5]

isEmpty / isNotEmpty

コレクションが空かどうかを確認します。

$isEmpty = $collection->isEmpty();
// $isEmpty中身: false

$isNotEmpty = $collection->isNotEmpty();
// $isNotEmpty中身: true

count

コレクションの要素数を取得します。

$collection = collect([5, 3, 1, 4, 2]);

$count = $collection->count();
// $countの中身: 5

contains

特定の値がコレクションに存在するか確認します。

$collection = collect([1, 2, 3, 4, 5]);

// シンプルな値の存在確認
$containsThree = $collection->contains(3);
// $containsThreeの中身: true

// コレクションが特定のキー・値を持つか確認
$users = collect([
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30],
]);

$containsUser = $users->contains(function ($user) {
    return $user['name'] === 'Bob' && $user['age'] === 30;
});
// $containsUserの中身: true

変換・操作

map

各要素に対して操作を行い、新しいコレクションを返します。

$collection = collect([1, 2, 3, 4, 5]);

$mapped = $collection->map(function ($item) {
    return $item * 2;
});
// $mappedの中身: [2, 4, 6, 8, 10]

filter

条件に合致する要素だけを残します。

$collection = collect([1, 2, 3, 4, 5]);

$filtered = $collection->filter(function ($item) {
    return $item > 2;
});
// $filteredの中身: [3, 4, 5]

pluck

コレクションの中から特定のキーだけを取得します。

$collection = collect([
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30],
]);

$names = $collection->pluck('name');
// $namesの中身: ['Alice', 'Bob']

reduce

コレクションを一つの値にまとめます。

$collection = collect([1, 2, 3, 4, 5]);

$sum = $collection->reduce(function ($carry, $item) {
    return $carry + $item;
}, 0);
// $sumの中身: 15

each

各要素に対して操作を行いますが、コレクションはそのまま返します。
※ループ処理向け

$collection->each(function ($item) {
    echo $item;
});

並び替え・検索

sort / sortDesc

順番を並び替えます。

sort : 昇順に並び替え
sortDesc : 降順に並び替え

$collection = collect([5, 3, 1, 4, 2]);

$sorted = $collection->sort();
// $sortedDescの中身: [1, 2, 3, 4, 5]

$sortedDesc = $collection->sortDesc();
// $sortedDescの中身: [5, 4, 3, 2, 1]

sortBy / sortByDesc

特定のキーに基づいて並び替えます。

sortBy : 特定のキーに基づいて昇順に並び替え
sortByDesc : 特定のキーに基づいて降順に並び替え

$collection = collect([
    ['name' => 'Charlie', 'age' => 35],
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30],
]);

$sorted = $collection->sortBy('age');
// $sortedの中身身: [
//  ['name' => 'Alice', 'age' => 25],
//  ['name' => 'Bob', 'age' => 30],
//  ['name' => 'Charlie', 'age' => 35]
// ]

$sortedDesc = $collection->sortByDesc('age');
// $sortedDescの中身: [
//  ['name' => 'Charlie', 'age' => 35],
//  ['name' => 'Bob', 'age' => 30],
//  ['name' => 'Alice', 'age' => 25]
// ]

first / last

first : コレクションの最初の要素を取得
last : コレクションの最後の要素を取得

$collection = collect([
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30],
    ['name' => 'Charlie', 'age' => 35],
]);

$first = $collection->first();
// $firstの中身: ['name' => 'Alice', 'age' => 25]

$last = $collection->last();
// $lastの中身: ['name' => 'Charlie', 'age' => 35]

where

特定の条件に合う要素を絞り込みます。

$collection = collect([
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30],
    ['name' => 'Charlie', 'age' => 35],
]);

$filtered = $collection->where('age', '>', 32);
// $filteredの中身: [['name' => 'Charlie', 'age' => 35]]

結合・分割

concat

コレクションに別の配列やコレクションを結合します。

$collection = collect([1, 2, 3]);

$concatenated = $collection->concat([4, 5, 6]);
// $concatenatedの中身: [1, 2, 3, 4, 5, 6]

merge

コレクションをマージ(結合)します。

$collection = collect(['name' => 'Alice']);

$merged = $collection->merge(['age' => 25]);
// $mergedの中身: ['name' => 'Alice', 'age' => 25]

chunk

コレクションを指定したサイズで分割します。

$collection = collect([1, 2, 3, 4, 5]);

$chunks = $collection->chunk(2);
// $chunksの中身: [[1, 2], [3, 4], [5]]

split

コレクションを指定した数で分割します。

$collection = collect([1, 2, 3, 4, 5]);

$split = $collection->split(3);
// $splitの中身: [[1, 2], [3, 4], [5]]

条件チェック・その他

every

すべての要素が条件を満たすか確認します。
※1つでも一致しなければfalseを返します。

$collection = collect([5, 3, 4, 6, 7]);

$every = $collection->every(function ($item) {
    return $item >= 3;
});
// $everyの中身: true

some

コレクション内のいずれかの要素が指定した条件を満たすかを確認します。
※1つでも条件に一致する要素があればtrueを返し、全て一致しなければfalseを返す

$collection = collect([1, 2, 3, 4, 5]);

$someGreaterThanTwo = $collection->some(function ($item) {
    return $item > 3;
});
// $someの中身: true

containsStrict

指定した値がコレクションに存在するかを厳密な比較(データ型も含む)で確認します。
※標準のcontains()と異なり、データ型まで一致しているか確認

$collection = collect([1, '3', 3, 4, 5]);

$containsStrictString = $collection->containsStrict('3');
// $containsStrictStringの中身: true

$containsStrictInteger = $collection->containsStrict(3);
// $containsStrictIntegerの中身: true

unique

コレクション内の重複した要素を取り除き、ユニークな要素だけを残します。
※オプションで、特定のキーに基づいてユニークな要素を取得することもできる

$collection = collect([1, 2, 2, 3, 4, 4, 5]);

$unique = $collection->unique();
// $uniqueの中身: [1, 2, 3, 4, 5]

$collection2 = collect([
    ['name' => 'Alice', 'email' => 'alice@example.com'],
    ['name' => 'Bob', 'email' => 'bob@example.com'],
    ['name' => 'Alice', 'email' => 'alice.another@example.com'],
]);

$uniqueByName = $collection2->unique('name');
// $uniqueByNameの中身: [
//  ['name' => 'Alice', 'email' => 'alice@example.com'],
//  ['name' => 'Bob', 'email' => 'bob@example.com']
// ]

groupBy

指定したキーやコールバックに基づいてコレクション内の要素をグループ化します。
※結果として、複数のコレクションを持つ新しいコレクションが返される

$collection = collect([
    ['name' => 'Alice', 'department' => 'Sales'],
    ['name' => 'Bob', 'department' => 'Sales'],
    ['name' => 'Charlie', 'department' => 'Marketing'],
]);

$groupedByDepartment = $collection->groupBy('department');
// $groupedByDepartmentの中身:
// [
//     'Sales' => [
//         ['name' => 'Alice', 'department' => 'Sales'],
//         ['name' => 'Bob', 'department' => 'Sales']
//     ],
//     'Marketing' => [
//         ['name' => 'Charlie', 'department' => 'Marketing']
//     ]
// ]

抽出・取得

take

指定した数だけ要素を取得します。

$collection = collect([1, 2, 3, 4, 5]);

$taken = $collection->take(3);
// $takenの中身: [1, 2, 3]

skip

指定した数だけ要素をスキップします。

$collection = collect([1, 2, 3, 4, 5]);

$skipped = $collection->skip(2);
// $skippedの中身: [3, 4, 5]

slice

コレクションの一部を抽出します。

$collection = collect([1, 2, 3, 4, 5]);

$sliced = $collection->slice(1, 3);
// $slicedの中身: [2, 3, 4]

only

特定のキーだけを含むコレクションを返します。

$collection = collect(['name' => 'Alice', 'email' => 'alice@example.com', 'password' => 'secret']);

$only = $collection->only(['name', 'email']);
// $onlyの中身: ['name' => 'Alice', 'email' => 'alice@example.com']
記事の内容
閉じる