お気に入りのcollectionメソッド紹介し〼

この記事はAll About Group（株式会社オールアバウト） Advent Calendar 2022 13日目の記事です。
突然ですが、Laravelのcollectionメソッドってたくさんありますよね。便利な反面、数が多くて全てを使いこなすようになるのはなかなか大変だと思います。
そこでこの記事では私のお気に入りメソッドたちを紹介していきます。

# toArray
`toArray()`はコレクションをPHPの配列に変換することができます。
```php
$collection = collect(['name' => 'Desk', 'price' => 200]);
$collection->toArray();

// 実行結果
[
    ['name' => 'Desk', 'price' => 200],
]
```
これ単体だけでも便利ですが、後述のメソッドと組み合わせることでより有効に使えます。
# pluck
`pluck()`を使うことで指定したキーの全コレクション値を取得することができます。

```php
$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
]);

// nameの値だけを取得する
$plucked = $collection->pluck('name');
$plucked->all();

// 実行結果
['Desk', 'Chair']
```
DBから取得したデータから特定のカラムの値だけを抜き出した配列を作りたい時などには`toArray()`を組み合わせることで簡単にやりたいことを達成できます。
# first
`first()`はコレクションの最初の要素を取得するメソッドですが、引数に`function(){ ... }`を指定することでより便利に使うことができます。
```php
// 引数指定無しの場合
collect([1, 2, 3, 4])->first();
// 実行結果
1

// 引数に条件指定をした場合
collect([1, 2, 3, 4])->first(function ($value, $key) {
    return $value > 2;
});
// 実行結果
3
```
# diff
`diff()`はコレクションとコレクション、もしくはコレクションと配列を比較し、元のコレクションに存在して指定したコレクションor配列に存在しないコレクションの値を返します。
```php
$collection = collect([1, 2, 3, 4, 5]);
$diff = $collection->diff([2, 4, 6, 8]);
$diff->all();
// 実行結果
[1, 3, 5]
```
上述の`pluck()`や`toArray()`と組み合わせるなどすることで、差分チェックの処理などを簡単に実装できるかと思います。
# map
`map()`はコレクション全体に繰り返し処理を行い、全てのデータに特定の加工をすることで新しいコレクションを作成します。
```php
$collection = collect([1, 2, 3, 4, 5]);
$multiplied = $collection->map(function ($item, $key) {
    // すべての値を×2する
    return $item * 2;
});
$multiplied->all();

// 実行結果
[2, 4, 6, 8, 10]
```
実務に近い使い方でいうと、数値データに`number_format()`を使って3桁区切りに変換したり、一律で単位を付与したい時に活用できそうです。
# sortBy, sortByDesc
`sortBy()`と`sortByDesc()`はソート順がそれぞれ昇順・降順に並べ替えるという違いですが、記述方法は同じです。
```php
$collection = collect([
    ['name' => 'Desk', 'price' => 200],
    ['name' => 'Chair', 'price' => 100],
    ['name' => 'Bookcase', 'price' => 150],
]);
// priceの値で昇順でソート
$sorted = $collection->sortBy('price');
$sorted->values()->all();

// 実行結果
[
    ['name' => 'Chair', 'price' => 100],
    ['name' => 'Bookcase', 'price' => 150],
    ['name' => 'Desk', 'price' => 200],
]

```
ここでは単純なキー指定のみ例示していますが、引数にクロージャを渡すことで独自のソート順を適用させることができます。
# unique
`unique()`は重複しない値だけを取得することができます。
ネストした配列やオブジェクトの場合は引数にキーを指定することでユニークなデータを取得できます。
```php
$collection = collect([
    ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
    ['name' => 'iPhone 5', 'brand' => 'Apple', 'type' => 'phone'],
    ['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
    ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
    ['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
]);
// brandの値が重複しないデータを取得
$unique = $collection->unique('brand');
$unique->values()->all();

// 実行結果
[
    ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
    ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
]
```
こちらもクロージャを引数に渡すことでより複雑なユニークデータの取得も可能になります。
```php
$collection = collect([
    ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
    ['name' => 'iPhone 5', 'brand' => 'Apple', 'type' => 'phone'],
    ['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
    ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
    ['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
]);
// brandとtypeの組み合わせで値が重複しないデータを取得
$unique = $collection->unique(function ($item) {
    return $item['brand'].$item['type'];
});

$unique->values()->all();

// 実行結果
[
    ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
    ['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
    ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
    ['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
]

```
# toJson
`toJson()`はコレクションをJSON形式に変換することができます。
```php
$collection = collect(['name' => 'Desk', 'price' => 200]);
$collection->toJson();

// 実行結果
{"name":"Desk","price":200}
```
JSON形式への変換はajax通信などを行う際に使用する機会が多いかと思います。

# 最後に
今回は「お気に入りのcollectionメソッド」と称していくつか紹介させていただきました。

実はここで紹介したものは、私が全くの未経験の状態からLaravelを使うようになった時に数ある中から優先して覚えたメソッドがほとんどです。
人それぞれどんなものを作りたいかによるとは思いますが、ここに挙げたメソッドはどんな場面でも活用できるものだと思います。これからLaravelを触ってみたい方に参考になれば幸いです。
他にも多くのメソッドがあるので興味がある方はぜひ調べてみてください。

# 参考
https://readouble.com/laravel/9.x/ja/collections.html