0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Laravel】モデル(Eloquent)における pluck と select の違い

Posted at

Laravelを触り始めて2か月、クエリビルダやEloquentを弄っていて特定のカラムだけ取得したいと思った時にpluckselect があり、どっちを使えばいいのかわからなくなりました。

どちらも特定のカラムを抽出するのに機能ではあるが、何が違うの?ということで、備忘録としてまとめます。

1. 結論:戻り値の「型」が違う

一言で言うと、「Collection(インスタンスの集まり)が欲しいのか、値の配列が欲しいのか」の違いです。

メソッド 戻り値の型 主な用途
select() Eloquent\BuilderCollection 複数のカラムを保持した「モデルオブジェクト」として扱いたい時
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.」と怒られるパターンがあります。

戻り値が「箱(モデル)」なのか「中身(値)」なのかを意識する必要がありそうですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?