Laravelの pluck は、コレクションや Eloquent の結果から「指定したキーの値だけ」を一気に取り出すメソッドです。ユーザー名の一覧、ID をキーにした連想配列、ネストした値の抽出などを1行で書けます。
この記事では、値だけを取り出す基本形から、キー付き配列・ドット記法・Collection / Eloquent / Query Builder での違い・map や keyBy との使い分け・つまずきやすい挙動(存在しないキー・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 として残り、重複キーは上書きされる点だけ覚えておけば、実務でつまずくことはありません。

コメントを残す