基本的なデータ操作に配列や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を使用していればもっとスマートに実装できていたなと思うところが沢山ある。。。