こんにちは、せぃゆーです。
今日は最近仕事でLaravelを使っていて便利だなと思ったので共有です。
使ってみて便利だなと思ったのがcollectionクラスです。
Laravelではモデルからデータを取得したとき(->get()で取得)したときにcollectionクラスで返ってきます。
今回はそのcollectionクラスのメソッドであるgroupByについて書きたいと思います。
何が便利なの?
何が便利なのかというと具体的な例を挙げるとDBにユーザの一覧が存在していて、年齢ごと分けたいとします。
// サンプルデータ
$users = [
['name' => 'taro', 'age' => '20'],
['name' => 'jiro', 'age' => '20'],
['name' => 'saburo', 'age' => '21'],
['name' => 'hanako', 'age' => '21'],
['name' => 'mika', 'age' => '20'],
];
上記データがDBからとってきた値だとした場合に今までは
$groupby_users = [];
foreach ($users as $user) {
$groupby_users[$user['age']][] = $user;
}
このようにforeachでループして分けていたと思います。
しかし、collectionクラスを使うことでシンプルに書くことができます。
// サンプルデータ(DBから取得した前提なのでcollectionクラスにする)
$users_collection = collect([
['name' => 'taro', 'age' => '20'],
['name' => 'jiro', 'age' => '20'],
['name' => 'saburo', 'age' => '21'],
['name' => 'hanako', 'age' => '21'],
['name' => 'mika', 'age' => '20'],
]);
// たった1行で年齢ごとにわけることができます。
$users_age_group = $user_collection->groupBy('age');
"元々のcollectionクラス"
array:5 [
0 => array:2 [
"name" => "taro"
"age" => "20"
]
1 => array:2 [
"name" => "jiro"
"age" => "20"
]
2 => array:2 [
"name" => "saburo"
"age" => "21"
]
3 => array:2 [
"name" => "hanako"
"age" => "21"
]
4 => array:2 [
"name" => "mika"
"age" => "20"
]
]
"年齢でgroupByを実行したデータ"
array:2 [
20 => array:3 [
0 => array:2 [
"name" => "taro"
"age" => "20"
]
1 => array:2 [
"name" => "jiro"
"age" => "20"
]
2 => array:2 [
"name" => "mika"
"age" => "20"
]
]
21 => array:2 [
0 => array:2 [
"name" => "saburo"
"age" => "21"
]
1 => array:2 [
"name" => "hanako"
"age" => "21"
]
]
]
"従来の方法で年齢別にしたデータ"
array:2 [
20 => array:3 [
0 => array:2 [
"name" => "taro"
"age" => "20"
]
1 => array:2 [
"name" => "jiro"
"age" => "20"
]
2 => array:2 [
"name" => "mika"
"age" => "20"
]
]
21 => array:2 [
0 => array:2 [
"name" => "saburo"
"age" => "21"
]
1 => array:2 [
"name" => "hanako"
"age" => "21"
]
]
]
ここでは年齢別でわける例にしましたが、こういった処理って意外と手間のかかる処理だと思うので私としてはすごい楽ができるのでうれしいです。
まとめ
groupBy以外にも便利なcollectionクラスのメソッドはたくさんあると思うので、利用したときにはまた記事にしたいと思います。
今回のコードはこちらのブランチにまとめてあります。
GitHub - seiyu-nico/laravel_collection
Contribute to seiyu-nico/laravel_collection development by creating an account on GitHub.
コメント