LaravelのCollectionで実際のプロジェクトに使用した物を紹介

LaravelのCollectionは簡単に説明すると「配列操作を便利にしてくれるClass」なのですが、使用できるメソッド数が多過ぎてどれを使えば良いのか毎回迷ってしまいます。

このページではLaravelのCollectionを過去のプロジェクトで使った経験から「これは使える」という使い方を解決したい項目別に紹介していきます。

参考にした公式ドキュメント

今回はLaravel10系での操作を前提に解説していきます。

そして、プロジェクトの機能によっては紹介する方法では賄いきれないので公式ドキュメントを見ながら実装していくことをオススメします。

Collectionのベースクラス

https://laravel.com/docs/10.x/collections#available-methods

Eloquent ORM のCollection (User::all() 等で取得されるCollection)

https://laravel.com/docs/10.x/eloquent-collections#available-methods

並び順の変更

sortBy(): 要素の昇順

要素の並び順を小さい順に変更します。

$collection = collect([
    ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
    ['name' => 'Chair', 'colors' => ['Black']],
    ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
]);
 
$sorted = $collection->sortBy(function (array $product, int $key) {
    return count($product['colors']);
});
 
$sorted->values()->all();
 
/*
    [
        ['name' => 'Chair', 'colors' => ['Black']],
        ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
        ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
    ]
*/

sortByDesc(): 要素の降順

sortBy() の逆順です。大きい順に変更します。

shuffle(): 要素の並び順をシャッフル

要素をシャッフルします。

MySQLのクエリなどでは並び順をランダムにする事は難しいのですが、こちらのメソッドで並び順をランダムにすることを実現しています。

$collection = collect([1, 2, 3, 4, 5]);
 
$shuffled = $collection->shuffle();
 
$shuffled->all();
 
// [3, 2, 5, 1, 4] - (generated randomly)

同じような名前の random() もありますが、random() は特定の1つをランダムに取得します。

値取り出し

map(): 各値を指定されたコールバックに渡します

これが一番使用します。

要素内の特定の値を返却することができます。

$collection = collect([1, 2, 3, 4, 5]);
 
$multiplied = $collection->map(function (int $item, int $key) {
    return $item * 2;
});
 
$multiplied->all();
 
// [2, 4, 6, 8, 10]

$collection = collect([
    ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
    ['name' => 'Chair', 'colors' => ['Black']],
    ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
]);
 
$multiplied = $collection->map(function (array $product, int $key) {
    return $product['name'];
});
 
$multiplied->all();
 
// ['Desk', 'Chair', 'Bookcase']

pluck(): 各値のKeyを取得します

map() と同じような機能ですが、より簡単に取得する事が可能です。

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
]);
 
$plucked = $collection->pluck('name');
 
$plucked->all();
 
// ['Desk', 'Chair']

特定要素の取得

filter(): 条件に当てはまる要素を選別

フィルタリングする方法です。

Collectionのfilterを使用すれば条件に一致する要素のみを取得することができます。

$collection = collect([1, 2, 3, 4]);
 
$filtered = $collection->filter(function (int $value, int $key) {
    return $value > 2;
});
 
$filtered->all();
 
// [3, 4]

slice(): 指定個数分だけ要素を取得

Collectionで特定の個数のみ取得したい場合にはsliceを使います。

$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
 
$slice = $collection->slice(4);
 
$slice->all();
 
// [5, 6, 7, 8, 9, 10]

$slice = $collection->slice(0, 5);
 
$slice->all();
 
// [1, 2, 3, 4, 5]

Array変換

toArray(): 配列に変換

Collectionを配列に変換します。

$collection = collect(['name' => 'Desk', 'price' => 200]);
 
$collection->toArray();
 
/*
    [
        ['name' => 'Desk', 'price' => 200],
    ]
*/

toArray() は要素内のネストされた情報も全て配列に変換します。Collection変換前の生データを取得したいばあいには all() を使用します。

Collectionは大量なデータ処理が苦手

Collectionは配列を便利に取り扱える反面、要素全てをClassに変換するので大量なデータを取り扱うのが苦手です。

その場合には処理する要素数を減らす必要があり、ORMではchunk()等を使用して一度に作成する量を減らせば解決できます。

LaravelのCollectionについて、終わりに

以上、配列を取り扱うのに便利なCollectionの紹介でした。

Collectionを活用すればデータ操作が格段にしやすくなり、複雑な処理を書く必要もなくなります。

今回紹介したメソッドはごく一部なので、公式のドキュメントを参考して他にどんなメソッドがあるか確認してみるのをオススメします。

お疲れ様でした。