Photoruction工事中!

Photoructionの開発ブログです!

Laravel Collection: 業務でよく使うメソッドを解説

はじめに

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のメソッドはまだまだたくさんあります。

配列を使って複雑な操作をする場合は、もしかすると使えそうなメソッドが見つかるかもしれないので是非公式ドキュメントも読んでみてください!

株式会社フォトラクションでは一緒に働く仲間を募集しています