Laravel Collection型が便利

基本的なデータ操作に配列やforeach()を使っていることが多いと思いますが
Collection型を使うことで効率よく処理を行うことが可能です。

Collection型とは?

標準的な配列と似た使い方ができますが、データ操作を便利にする豊富なメソッドが用意されています。 例えば、配列を使った場合は、複数の関数を組み合わせたり、foreachを使ったループ処理が必要になることが多いですが、Collectionを使うとシンプルかつ直感的に処理が書けます。

Collectionの生成

Laravelのcollect()関数で生成できます。
$users = [
    ['name' => 'John', 'age' => 28],
    ['name' => 'Jane', 'age' => 32],
    ['name' => 'Tom', 'age' => 24],
];

$collection = collect($users);

豊富なメソッド

map, each, filter, reduce, pluck, sort, groupByなど多くのメソッドが用意されています。

each

$collection = collect([1, 2, 3, 4]);
$result = $collection->each(function ($item) {
           if ($item < 15) {
               dump($item + 4);    // 5, 6, 7, 8
           }
       }); 

map

$collection = collect([1, 2, 3, 4]);
$new_collection = $collection->map(function ($item, $key) {
    return $item + $key;
});
$new = $new_collection->toArray();
dd($new_collection);

// 結果
 [
    0 => 1      0(key) + 1(val) = 1
    1 => 3      1(key) + 2(val) = 3
    2 => 5      2(key) + 3(val) = 5
    3 => 7      3(key) + 4(val) = 7
  ]

reduce

$items = collect([
    ['price' => 100, 'quantity' => 2],
    ['price' => 150, 'quantity' => 1],
    ['price' => 200, 'quantity' => 3],
]);

$totalPrice = $items->reduce(function ($carry, $item) {
    return $carry + ($item['price'] * $item['quantity']);
}, 0);
dd($totalPrice);    // 950

pluck

$articles = Article::pluck('title');
dd($articles);  // articlesテーブルのtitleカラムのみを抽出したもの

チェーンメソッドが可能

$collection = collect([1, 2, 3, 4, 5])
    ->filter(function ($value) {
        return $value > 2;
    })
    ->map(function ($value) {
        return $value * 2;
    });
// 結果: [6, 8, 10]

簡単に配列に変換

$array = $collection->toArray();

これまでの案件にもCollectionを使用していればもっとスマートに実装できていたなと思うところが沢山ある。。。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です