【Laravel】ネストしたCollectionの中から、指定したキーの値の一覧を取り出す（pluckメソッド）

ネストしたCollectionの中から、指定したキーの値を取り出してまとめたいシーンがあった。

利用バージョン：Laravel 6.20.32

## pluckメソッド
pluck()メソッドは、下記のようなCollectionから、特定のキー（下記の例では'name'）の値のみ取り出したいときに使用する。

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

$plucked = $collection->pluck('name');

$plucked->all();

// ['Desk', 'Chair']
```

## collapseメソッド
collapseメソッドは、配列のコレクションをフラットな一次コレクションに展開できる。
pluckに加えてこのメソッドも使用する。

```
$collection = collect([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);

$collapsed = $collection->collapse();

$collapsed->all();

// [1, 2, 3, 4, 5, 6, 7, 8, 9]
```

## ネストしたCollectionを用意して、pluck実行
tinkerでCollectionの挙動を確認する。ターミナルでtinkerを起動。

```
php artisan tinker
```

### 例1
ネストしたCollectionを用意する。

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

$collection = collect([
    ['package' => $collection_child, 'name' => 'Desk&Chair'],
]);
```

下記のようなCollectionが得られる。

```
=> Illuminate\Support\Collection {#4422
     all: [
       [
         "package" => Illuminate\Support\Collection {#4439
           all: [
             [
               "product_id" => "prod-100",
               "name" => "Desk",
             ],
             [
               "product_id" => "prod-200",
               "name" => "Chair",
             ],
           ],
         },
         "name" => "Desk&Chair",
       ],
     ],
   }
```

#### 実行
下記のように実行することで、ネストしたキーの値を取得できる。

```
$collection->pluck('package')->collapse()->pluck('name');

// アスタリスクでつないで記述も可能
$collection->pluck('package.*.name')->collapse();
```

#### 結果

```
=> Illuminate\Support\Collection {#4528
     all: [
       "Desk",
       "Chair",
     ],
   }
```

### 例2
複数ネストしたCollectionを用意する。

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

$collection_child2 = collect([
    ['product_id' => 'prod-300', 'name' => 'Light'],
    ['product_id' => 'prod-400', 'name' => 'Laptop'],
]);

$collection = collect([
    ['package' => $collection_child1, 'name' => 'Desk&Chair'],
    ['package' => $collection_child2, 'name' => 'Light&Laptop'],
]);
```

下記のようなCollectionが得られる。

```
=> Illuminate\Support\Collection {#4462
     all: [
       [
         "package" => Illuminate\Support\Collection {#4529
           all: [
             [
               "product_id" => "prod-100",
               "name" => "Desk",
             ],
             [
               "product_id" => "prod-200",
               "name" => "Chair",
             ],
           ],
         },
         "name" => "Desk&Chair",
       ],
       [
         "package" => Illuminate\Support\Collection {#4414
           all: [
             [
               "product_id" => "prod-300",
               "name" => "Light",
             ],
             [
               "product_id" => "prod-400",
               "name" => "Laptop",
             ],
           ],
         },
         "name" => "Light&Laptop",
       ],
     ],
   }
```

#### 実行
例1と同様に、下記のように実行することで、ネストしたキーの値を取得できる。

```
$collection->pluck('package')->collapse()->pluck('name');

// アスタリスクでつないで記述も可能
$collection->pluck('package.*.name')->collapse();
```

#### 結果
下記のようなCollectionが得られる。

```
=> Illuminate\Support\Collection {#4510
     all: [
       "Desk",
       "Chair",
       "Light",
       "Laptop",
     ],
   }
```