はじめに
Webエンジニアの春冨です。
フォトラクションに今年の7月に転職してから初めてLaravelを使って開発をしてます。
Laravelには便利な機能がいっぱいあって覚えるのが大変ですが、その中でもCollectionクラス(Illuminate\Support\Collection)がとても便利だったので紹介しようと思います。
LaravelのCollectionとは
LaravelのCollectionは、PHPで利用可能な配列操作をより書きやすく使いやすくするためのラッパーです。
また、Collectionはメソッドチェーンを使用して複数の操作を一連の流れで簡潔に記述できるため、コードの可動性が向上することも期待できます。
では実際に業務などでよく使用するメソッドをいくつか見ていきましょう。
ちなみにCollectionで使用できる全メソッドはLaravelの公式ドキュメントに載っているので、そちらも参考にしてください。
map
mapメソッドとは、コレクション内の各要素に対して指定されたコールバック関数を適用し、その結果から新しいコレクションを作成して返します。
例)
以下の例ではコレクションの各要素の値を使用して新しくインスタンスを生成しています。
このように各要素の値を使用して新しいものを作成したり、値を変換したりするのによく使用します。
$collection = collect([ ['name' => 'yamada', 'age' => 20], ['name' => 'tanaka', 'age' => 25] ]); $users = $collection->map(function ($user) { return new User($user['name'], $user['age']); }); // 結果 [ UserA {#6360 +name: "yamada", +age: 20, }, UserA {#6391 +name: "tanaka", +age: 25, }, ]
注意点としてはmap
メソッドは元のコレクションを変更するのではなく、新しいコレクションを返すので結果は変数に入れるなどする必要があります。
filter
filterメソッドとは、コレクション内の各要素に対して指定されたコールバック関数を適用し、その結果がTrue
のものを返します。
例)
以下の例ではage
が20より大きいものだけを返すようにしてます。
このようにある条件を満たしたものだけを取得するときに使用します。
バリデーションチェックをして結果がTrue
のものだけが欲しいみたいなシーンで使用したりします。
$collection = collect([ ['name' => 'yamada', 'age' => 20], ['name' => 'tanaka', 'age' => 25] ]); $result = $collection->filter(function ($item) { return $item['age'] > 20; }); // 結果 [ 1 => [ "name" => "tanaka", "age" => 25, ], ]
every
everyメソッドとは、コレクションの全要素に対して指定されたコールバック関数を適用し、その結果が全てTrue
になるかを判定します。全てTrue
になった場合はTrue
、1つでもFalse
がある場合はFalse
を返します。
例)
以下の例ではコレクションの全ての要素のage
が30より小さいかを判定しています。全て30より小さいので結果はTrue
になります。
コレクション内の要素がある条件に対して全てTrueである必要があるため、例えば全ての要素がバリデーションチェックに通る必要があるシーンなどに使用します。
$collection = collect([ ['name' => 'yamada', 'age' => 20], ['name' => 'tanaka', 'age' => 25], ['name' => 'satou', 'age' => 28] ]); $result = $collection->every(function ($item) { return $item['age'] < 30; }); // 結果 true
pluck
pluckメソッドとは、指定したキーの値をコレクションから取得します。
例)
以下の例ではコレクションからname
の値のみを取得してます。
第2引数を指定することで値をkey => value
の形で取得することもできます。ただし、注意点として第1引数がvalue
、第2引数がkey
になります。
DBからデータを取得してきたときにある特定のカラムの値だけが欲しい時に使用することが多いです。
$collection = collect([ ['name' => 'yamada', 'age' => 20], ['name' => 'tanaka', 'age' => 25], ['name' => 'satou', 'age' => 28] ]); $result = $collection->pluck('name'); // 結果 [ "yamada", "tanaka", "satou", ], $result = $collection->pluck('age', 'name'); // 結果 [ "yamada" => 20, "tanaka" => 25, "satou" => 28, ]
groupBy
groupByメソッドとは、指定したキーによりコレクションの各要素をグループにまとめます。
また、キーにコールバック関数を渡してその結果でグルーピングすることも可能です。
例)
以下の例ではキーにage
を指定することで、age
が同じ値のものでグルーピングしてます。
groupBy
はグルーピングして終わりではなく、ある特定の値でグルーピングをした後に、その値に対して何か操作を実行するといった使い方が多いです。
$collection = collect([ ['name' => 'yamada', 'age' => 20], ['name' => 'tanaka', 'age' => 20], ['name' => 'satou', 'age' => 28] ]); $result = $collection->groupBy('age'); // 結果 [ 20 => [ [ "name" => "yamada", "age" => 20, ], [ "name" => "tanaka", "age" => 20, ], ], 28 => [ [ "name" => "satou", "age" => 28, ], ], ]
sortBy
sortByメソッドとは、指定したキーでコレクションをソートします。注意点としてはソート済みのコレクションは元の配列のキーを保持します。なのでキーをリセットするにはvaluesメソッドを呼ぶ必要があります。
また、第2引数に、ソートフラグを渡すことでソートの動作を調整できます。
例)
以下のようにキーを指定することでそのキーを使ってソートすることができます。ソートは昇順になるので降順でソートをしたい場合はsortByDesc()
を使用します。
$collection = collect([ ['name' => 'yamada', 'age' => 25], ['name' => 'tanaka', 'age' => 20], ['name' => 'satou', 'age' => 28] ]); $result = $collection->sortBy('age')->values(); // 結果 [ 1 => [ "name" => "tanaka", "age" => 25, ], ]
unique
uniqueメソッドは、コレクションの重複を取り除いた結果を返します。ネストした配列やオブジェクトを使用する場合は一意であることを決めるキーを指定する必要があります。
例)
以下の例のように一意にしたいキーを指定することで、その値が重複しているものを取り除いたコレクションを返します。
ある処理を実行するときに、同じ値に対して実行する必要がないときはunique
でデータを絞ったりします。
$collection = collect([ ['name' => 'yamada', 'age' => 25], ['name' => 'tanaka', 'age' => 20], ['name' => 'satou', 'age' => 25] ]); $result = $collection->unique('age'); // 結果 [ [ "name" => "yamada", "age" => 25, ], [ "name" => "tanaka", "age" => 20, ], ],
最後に
LaravelのCollectionについていくつか紹介しましたが、Collectionのメソッドはまだまだたくさんあります。
配列を使って複雑な操作をする場合は、もしかすると使えそうなメソッドが見つかるかもしれないので是非公式ドキュメントも読んでみてください!