ORM

Laravel Eloquent pluck入門|特定カラムのデータだけを効率的に取得する

Eloquentのpluck()メソッドは、データベースから特定のカラムの値だけを取得するメソッドです。全カラムを取得してからPHPで絞り込むよりも効率的で、セレクトボックスの選択肢生成やIDリストの取得など、実務で非常によく使われます。この記事では、pluck()の基本的な使い方から実践的な活用パターンまで解説します。

pluckの基本的な使い方

pluck()は、モデルのクエリビルダーから特定のカラムの値だけをコレクションとして取得するメソッドです。

PHP
use App\Models\Employee;

// 全社員の名前だけを取得
$names = Employee::pluck('name');
// => Collection ["田中太郎", "佐藤花子", "鈴木一郎", ...]

// 結果はコレクションなので、foreachでループ可能
foreach ($names as $name) {
    echo $name;
}

pluck()の戻り値はLaravelのCollectionオブジェクトです。配列のように扱えますが、map()filter()unique()などのコレクションメソッドも使用できます。

ポイント

内部的にpluck()SELECT name FROM employeesのようなSQLを発行します。全カラムを取得するall()get()と比べて、転送データ量が少なく高速です。

キー付きpluck

pluck()の第2引数にカラム名を指定すると、そのカラムの値をキーとした連想配列風のコレクションが返ります。セレクトボックスの選択肢を生成する際に非常に便利です。

PHP
// idをキー、nameを値としたコレクション
$departments = Department::pluck('name', 'id');
// => Collection {1: "営業部", 2: "開発部", 3: "総務部", ...}

// Bladeテンプレートでセレクトボックスに利用
// コントローラー
public function create()
{
    $departments = Department::pluck('name', 'id');
    return view('employees.create', compact('departments'));
}
resources/views/employees/create.blade.php
<select name="department_id">
    <option value="">部署を選択</option>
    @foreach($departments as $id => $name)
        <option value="{{ $id }}">{{ $name }}</option>
    @endforeach
</select>

このパターンはフォームの開発で非常に頻繁に使います。pluck('表示値', 'value値')と覚えておくと便利です。

条件付きpluck

where()orderBy()などのクエリビルダーメソッドと組み合わせることで、条件を指定してデータを取得できます。

PHP
// アクティブな社員の名前だけを取得
$activeNames = Employee::where('status', 'active')->pluck('name');

// 特定の部署に所属する社員のメールアドレス
$emails = Employee::where('department_id', 1)->pluck('email');

// 名前順にソートして取得
$sortedNames = Employee::orderBy('name')->pluck('name', 'id');

// 最新の10件のIDを取得
$recentIds = Employee::orderBy('created_at', 'desc')
    ->limit(10)
    ->pluck('id');

// 重複を除いた部署IDのリスト
$departmentIds = Employee::distinct()->pluck('department_id');
ポイント

pluck()はクエリビルダーのチェーンの最後に呼び出します。where()orderBy()limit()join()など、全てのクエリビルダーメソッドと組み合わせることができます。

pluckとget/allの使い分け

pluck()get()all()はいずれもデータを取得するメソッドですが、用途とパフォーマンスが異なります。適切に使い分けることが重要です。

PHP
// pluck: 特定カラムの値だけ取得(モデルインスタンスは生成されない)
$names = Employee::pluck('name');
// SQL: SELECT name FROM employees

// get: 指定条件でモデルインスタンスのコレクションを取得
$employees = Employee::where('status', 'active')->get();
// SQL: SELECT * FROM employees WHERE status = 'active'

// select + get: 特定カラムのモデルインスタンスを取得
$employees = Employee::select('id', 'name', 'email')->get();
// SQL: SELECT id, name, email FROM employees
// $employees[0]->name でアクセス可能(モデルのメソッドも使える)
注意

pluck()はモデルのインスタンスを生成しません。そのため、アクセサ(getNameAttributeなど)やリレーションは使用できません。モデルのメソッドが必要な場合はselect()get()の組み合わせを使いましょう。

実践的な活用パターン

pluck()がよく使われる実践的なパターンを紹介します。

PHP
// パターン1: whereInの条件値として使う
$departmentIds = Employee::where('status', 'active')
    ->pluck('department_id')
    ->unique();
$departments = Department::whereIn('id', $departmentIds)->get();

// パターン2: セレクトボックスの選択肢
$options = Category::orderBy('sort_order')->pluck('name', 'id');

// パターン3: CSVエクスポート用のデータ取得
$emails = User::where('newsletter', true)->pluck('email')->toArray();

// パターン4: リレーション先のpluck
$department = Department::find(1);
$employeeNames = $department->employees()->pluck('name');

// パターン5: コレクションメソッドとの組み合わせ
$nameList = Employee::pluck('name')->implode(', ');
// => "田中太郎, 佐藤花子, 鈴木一郎"

まとめ

  • pluck('カラム名')で特定カラムの値だけをコレクションとして取得する
  • 第2引数を指定すると、キー付きコレクション(pluck('name', 'id'))を取得できる
  • セレクトボックスの選択肢生成にはpluck('表示値', 'value値')が便利
  • where()orderBy()等のクエリビルダーと自由に組み合わせ可能
  • モデルのメソッドが不要な場面ではget()よりpluck()が高パフォーマンス
  • モデルのアクセサやリレーションが必要な場合はselect()+get()を使う