Laravelには配列をより簡単に、便利に操作できるようにするCollectionクラスがあります。
このCollectionクラスはEloquentクラスのgetメソッドやallメソッドなどの戻り値もCollectionクラスであるため、実際の開発でも使用頻度はかなり高いです。
collectionメソッドでどんなことができるのか知っているだけで開発効率が上がることでしょう。
この記事ではcollectionメソッドの使い方を紹介していきたいと思います。
なお、Eloquentクラスのメソッドの戻り値であるCollectionクラスはIlluminate\Database\Eloquent\Collectionクラスで、collectへルパなどを使用した場合はIlluminate\Support\Collectionクラスを戻り値として返すので厳密には異なるものですが、基本的な使い方は似ている部分がある(Eloquentコレクションはコレクションオブジェクトをベースに拡張されたものであるため)ので、この記事では細かい違いは気にせず進めていきます。
コレクションの生成
まずはコレクションメソッドを使うにあたって、コレクション生成の仕方を確認していきましょう。
配列
collectへルパの引数に配列を渡すことで戻り値としてコレクションを生成できます。
$collection = collect([1, 100, 30]);
連想配列
配列の時と同様にcollectへルパの引数に連想配列を渡すだけで戻り値として、コレクションが生成されます。
$collection = collect([
'name' => '太郎',
'email' => 'taro@example.com',
'age' => 23,
]);
モデル
モデルについては冒頭に説明したように、allメソッドやgetメソッドの戻り値がコレクションインスタンスが取得できます。
この場合、コレクションの要素はモデル(User)インスタンスとなります。
$users = User::all();
コレクションメソッドの紹介
次はコレクションメソッドの使い方を紹介していきましょう。
コレクションメソッドは数多く用意されているので、ここではよく使うメソッドを5つ紹介していきたいと思います。
map
mapメソッドはコレクション全体で繰り返し処理を行います。
クロージャで定義した処理をコレクションの要素それぞれに実行します。
returnした値を元にIlluminate\Support\Collectionクラスのインスタンスが戻り値として取得できます。
$users = User::all();
$collection = $users->map(function ($user) {
return $user->name . "さん";
});
filter
filterメソッドもmapメソッド同様にコレクション全体で繰り返し処理を行います。
filterメソッドの場合、クロージャで定義した処理をそれぞれの要素に対して実行し、returnがtrueだった要素のみを戻り値のコレクションに含めます。
下記のコードではidが奇数の要素のみを返してくれます。
$users = User::all();
$collection = $users->filter(function ($user) {
return $user->id % 2 === 1;
});
pluck
pluckメソッドはコレクションのキーを引数に指定することで、該当キーの値を抽出したコレクションが戻り値として取得できます。
$users = User::all();
$collection = $users->pluck('name');
また、第2引数に指定したキーの値を戻り値のコレクションのキーに指定することもできます。
$users = User::all();
$collection = $users->pluck('name', 'id');
sortBy
sortByメソッドは引数にコレクションのキーを指定することで、そのキーの値の昇順で並び替えたコレクションを戻り値として返します。
$users = User::all();
$collection = $users->sortBy('name');
sortByDescメソッドはsortByメソッドとは逆でキーの値の降順で並び替えたコレクションを戻り値として返します。
$users = User::all();
$collection = $users->sortByDesc('name');
reverse
reverseメソッドは対象コレクションの現在の並び順とは逆順にしたコレクションを返してくれます。
$users = User::all();
$collection = $users->reverse();
まとめ
コレクションメソッドの基本的な使い方を紹介してきました。
コレクションメソッドには便利なメソッドが数多く用意されています。
これらを活用することでより効率よく開発することができるでしょう。