Laravelを触り始めて2か月、クエリビルダやEloquentを弄っていて特定のカラムだけ取得したいと思った時にpluck と select があり、どっちを使えばいいのかわからなくなりました。
どちらも特定のカラムを抽出するのに機能ではあるが、何が違うの?ということで、備忘録としてまとめます。
1. 結論:戻り値の「型」が違う
一言で言うと、「Collection(インスタンスの集まり)が欲しいのか、値の配列が欲しいのか」の違いです。
| メソッド | 戻り値の型 | 主な用途 |
|---|---|---|
select() |
Eloquent\Builder → Collection
|
複数のカラムを保持した「モデルオブジェクト」として扱いたい時 |
pluck() |
Support\Collection (値のみ) |
特定のカラムの値だけを「単純な配列(Collection)」として扱いたい時 |
2. select メソッド
select は、SQLの SELECT 文を発行するイメージに近いです。
$users = User::select('name', 'email')->get();
中身を確認
Illuminate\Database\Eloquent\Collection {#785 ▼ // app\Http\Livewire\....
#items: array:520 [▼
0 =>
//省略
特徴
- 結果は モデルのインスタンスが含まれた Collection で返ってきます。
-
$users[0]->nameのように、オブジェクトとしてプロパティにアクセスします。 -
get()を呼び出すまでクエリは実行されません。
3. pluck メソッド
pluck は、特定のカラムの値を「引っこ抜く(Pluck)」イメージです。
$names = User::pluck('name');
// 結果: ["Tanaka", "Sato", "Suzuki"]
中身を確認
Illuminate\Support\Collection {#1333 ▼ // app\Http\Livewire\...
#items: array:514 [▶]
#escapeWhenCastingToString: false
}
特徴
- 結果は 指定したカラムの値だけの Collection で返ってきます。
- モデルのインスタンスではなく、ただの「値のリスト」になります。
-
pluck()を呼んだ時点でクエリが実行され、結果が返ります(get()は不要)。 - 第2引数にキーを指定することもできます:
pluck('name', 'id')とすると、IDをキーにした連想配列のようになります。
4. どっちを使うべきか
使い分けの判断基準は以下の通りです。
select を使うべき場面
- 複数のカラムを取得したい。
- 取得したデータに対して、モデルに定義したメソッド(アクセサなど)を使いたい。
- 後からさらにクエリ条件(
whereなど)を追加したい。
pluck を使うべき場面
- ある1つのカラム(例:IDのリストや名前のリスト)だけが欲しい。
- そのまま
foreachで回して値だけを使いたい。 - セレクトボックス(
<select>タグ)の選択肢を作りたい。
まとめ
- 「モデル」として、「オブジェクト」として扱いたいなら
select - 値のリストが欲しいなら
pluck
pluck で取ったものに対して $user->email のようにアクセスしようとして「Property [email] does not exist on this collection instance.」と怒られるパターンがあります。
戻り値が「箱(モデル)」なのか「中身(値)」なのかを意識する必要がありそうですね。