概要
コレクションは、配列データを便利に操作できるラッパーで多彩なメソッドを提供します。
※メソッドも豊富でメソッドチェーン可能
メソッドチェーンとは、複数のメソッドを連続して呼び出すテクニック
【ファイル先】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
順番を並び替えます。
$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
特定のキーに基づいて並び替えます。
$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
$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']