Laravelのpluckの使い方|値の一覧・キー付き配列・ネスト取得を解説

by

カテゴリー:

Laravelの pluck は、コレクションや Eloquent の結果から「指定したキーの値だけ」を一気に取り出すメソッドです。ユーザー名の一覧、ID をキーにした連想配列、ネストした値の抽出などを1行で書けます。

この記事では、値だけを取り出す基本形から、キー付き配列・ドット記法・Collection / Eloquent / Query Builder での違い・mapkeyBy との使い分け・つまずきやすい挙動(存在しないキー・null・重複キー)までをまとめて解説します。

pluckで取得できるもの(最小コード例)

まずは一番よく使う形です。pluck('キー名') と書くと、そのキーの値だけを並べた新しいコレクションが返ります。

$users = collect([
    ['id' => 1, 'name' => 'John'],
    ['id' => 2, 'name' => 'Jane'],
    ['id' => 3, 'name' => 'Doe'],
]);

$names = $users->pluck('name');

$names->all();
// ['John', 'Jane', 'Doe']

戻り値は配列ではなくコレクションです。素の配列が欲しいときは ->all()->toArray() を続けます。以降の解説もこの形が基本になります。

pluck(‘name’):値だけを取り出す

引数を1つだけ渡すと、その値を順番に並べたコレクションになります。テンプレートに一覧を渡したいときや、implode でカンマ区切りにしたいときに便利です。

$names = $users->pluck('name');

// カンマ区切りの文字列にする
$names->implode(', ');
// 'John, Jane, Doe'

pluck(‘name’, ‘id’):キー付き配列を取り出す

第2引数に別のキーを渡すと、そのキーを連想配列のキーにできます。「ID をキー、名前を値」にしたいときの定番です。

$namesById = $users->pluck('name', 'id');

$namesById->all();
// [
//     1 => 'John',
//     2 => 'Jane',
//     3 => 'Doe',
// ]

プルダウンの <option value="id">name</option> を組み立てるときなど、ID と表示名をセットで扱いたい場面で重宝します。

ドット記法でネストした値を取り出す

多重配列の奥にある値も、'キー.子キー' のようにドットでつなげて取り出せます。第2引数と組み合わせれば、ネストした値をキー付きで取得できます。

$collection = collect([
    ['id' => 100, 'name' => '太郎', 'scores' => ['国語' => 92, '数学' => 73]],
    ['id' => 200, 'name' => '二郎', 'scores' => ['国語' => 89, '数学' => 47]],
]);

// scores.数学 を name をキーにして取り出す
$collection->pluck('scores.数学', 'name')->all();
// [
//     '太郎' => 73,
//     '二郎' => 47,
// ]

// 配列指定でも同じことができる
$collection->pluck(['scores', '国語'], 'name')->all();
// [
//     '太郎' => 92,
//     '二郎' => 89,
// ]

第1引数に null、第2引数にキーを渡すと、値は取り出さずにキーだけを振り直す使い方もできます(要素まるごとを新しいキーに割り当てます)。

$collection->pluck(null, 'id')->all();
// [
//     100 => ['id' => 100, 'name' => '太郎', 'scores' => [...]],
//     200 => ['id' => 200, 'name' => '二郎', 'scores' => [...]],
// ]

この「要素まるごとを再キーする」動きは、後述の keyBy と同じ結果になります。

Collection・Eloquent・Query Builderでの違い

pluck は呼び出す対象によって「どこで処理されるか」が変わります。ここを理解すると、無駄なデータ取得を避けられます。

// 1. Collection:メモリ上の配列に対して抽出
collect($array)->pluck('name');

// 2. Query Builder:SQLで name 列だけをSELECTして取得(効率的)
DB::table('users')->pluck('name');

// 3. Eloquent(静的呼び出し):Query Builderに委譲され name 列だけSELECT
User::pluck('name');

// 4. Eloquent(全件ロード後):全列を取得してからメモリ上で抽出(非効率)
User::all()->pluck('name');
  • Query Builder / User::pluck():SQL の SELECT name だけが走るので、必要な列だけを DB から取得できて軽い。
  • User::all()->pluck():いったん全カラム・全レコードをメモリに載せてから抽出するため、件数が多いと無駄が大きい。
  • Collection の pluck:すでに手元にある配列・コレクションから取り出す。API レスポンスや加工済みデータに対して使う。

名前の一覧だけが欲しいのに User::all()->pluck('name') と書くのは典型的な無駄です。DB から取るなら User::pluck('name') を選びましょう。

map・keyBy・select との使い分け

「値を取り出す」「形を変える」系のメソッドは似ていて迷いがちです。目的別に整理すると次の通りです。

メソッドやること戻り値のイメージ使いどころ
pluck('name')1つのキーの値だけを抜き出す['John', 'Jane']値の一覧が欲しいとき
pluck('name', 'id')キーを付けて抜き出す[1 => 'John']ID→名前の対応表が欲しいとき
map(fn)各要素をコールバックで自由に加工加工後の任意の形複数キーを組み合わせる・計算する
keyBy('id')要素はそのまま、キーだけ振り直す[1 => [...元の要素]]要素全体を ID で引きたいとき
select(['id','name'])各要素から指定キーだけ残す(L9+)[['id'=>1,'name'=>'John']]一部の列だけに絞りたいとき

ざっくり言うと、単一の値なら pluck、複数キーや計算が絡むなら map、要素まるごとを引きたいなら keyBy という住み分けです。map の詳しい使い方はLaravel Collectionのmapメソッドでデータ変換する記事を参照してください。

存在しないキー・null・重複キーの挙動

実務でつまずきやすいのが、キーが揃っていないデータや重複するキーを渡したときの挙動です。あらかじめ知っておくとバグを避けられます。

存在しないキー・nullは「null」になる

指定したキーが無い要素や、値が null の要素は、スキップされずに null として並びます。要素数は元のコレクションと一致します。

$collection = collect([
    ['id' => 1, 'name' => 'John'],
    ['id' => 2],                       // name キーが無い
    ['id' => 3, 'name' => null],        // name が null
]);

$collection->pluck('name')->all();
// ['John', null, null]

// null を除きたいときは filter を続ける
$collection->pluck('name')->filter()->values()->all();
// ['John']

重複キーは後の値で上書きされる

第2引数のキーが重複していると、連想配列の性質上後の値で上書きされます。件数が減ることに注意してください。

$collection = collect([
    ['bird' => '文鳥',   'color' => '白'],
    ['bird' => 'インコ', 'color' => '黄色'],
    ['bird' => '文鳥',   'color' => 'シナモン'],
    ['bird' => 'インコ', 'color' => '青'],
]);

$collection->pluck('color', 'bird')->all();
// [
//     '文鳥'   => 'シナモン',   // 白 が上書きされた
//     'インコ' => '青',        // 黄色 が上書きされた
// ]

キーが重複するデータで「全部を残したい」ときは、pluck ではなく groupBy でキーごとにまとめるのが定番です。

pluckの実装(内部の動き)

Collection の pluck は、内部では Arr::pluck() を呼んでいるだけのシンプルな作りです。ドット記法の解決もこの中で行われます。

public function pluck($value, $key = null)
{
    return new static(Arr::pluck($this->items, $value, $key));
}

関連するCollectionメソッド

pluck と組み合わせてよく使う Collection メソッドもあわせて押さえておくと、データ加工がぐっと楽になります。

まとめ

pluck は「指定したキーの値だけを取り出す」メソッドで、第2引数でキー付き配列に、ドット記法でネストした値にも対応します。DB から取るなら User::pluck()、手元のデータなら Collection の pluck、要素まるごとを引くなら keyBy、複数キーの加工なら map と使い分けましょう。存在しないキーや null は null として残り、重複キーは上書きされる点だけ覚えておけば、実務でつまずくことはありません。

ホーム » 記事一覧 » 技術メモ » 開発 » Laravelテクニック » Laravelのpluckの使い方|値の一覧・キー付き配列・ネスト取得を解説

投稿者

ここまで読んでいただき、ありがとうございます。

このサイトでは、私自身が関わっていることや、興味を持って試していることをそのまま置いています。

内容を見ていて、
「少し話を聞いてみたい」
「協業できる部分がありそう」
と感じる点があれば、下記のお問い合わせフォームからご連絡ください。状況を確認したうえで、必要な範囲でお返事します。

特に、以下のWordPressサイトに関する相談にも対応しているのでご興味ありましたらご相談ください。


Comments

“Laravelのpluckの使い方|値の一覧・キー付き配列・ネスト取得を解説” への1件のフィードバック

  1. […] Laravel Collectionのpluckメソッドを使って必要な情報を取り出す方法:特定のキーの値を一覧で取り出す […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です