【Laravel基礎学習13】クエリビルダーについて解説

laravelアイキャッチ Laravel

こんにちは、かつコーチです。

LaravelでDatabaseを扱うときに、クエリビルダー(Query Builder)があります。

今回は、そのクエリビルダーについて解説します。

Query Builderとは?

LaravelのQuery Builderは、データベースと対話するための強力かつ柔軟なツールで、

SQLクエリを直書きせずに、流暢で直感的なインターフェースを使ってデータベース操作が行えます。

クエリビルダーは、Laravelで用意されているEloquent ORMよりも軽量で、

直接的にデータベースにアクセスしたい場合やパフォーマンスを重視する場面で役立ちます。

特徴

  • 流暢なインターフェース: メソッドチェーンを使ってクエリを組み立てることで、シンプルかつ可読性の高いコードが書けます。
  • データベースに依存しない: Laravelのクエリビルダーは、サポートしている複数のデータベース(MySQL、PostgreSQL、SQLite、SQL Serverなど)に対して共通のインターフェースを提供します。
  • 安全性: プレースホルダ(バインディング)を使うことで、SQLインジェクションのリスクを軽減します。
  • 高度な機能: 基本的なCRUD操作に加え、集計、結合、サブクエリ、条件付きクエリ、トランザクションのサポートなど、さまざまな操作が簡単に実行できます。

基本的な使い方

クエリビルダーを使う際は、DBファサードを利用してクエリを組み立てます。

データの取得

データベースから情報を取得するのが最も基本的な操作です。

// 全てのレコードを取得
$users = DB::table('users')->get();

// 特定のカラムのみを取得
$names = DB::table('users')->pluck('name');

// 単一のレコードを取得
$user = DB::table('users')->where('id', 1)->first();

データの挿入

データベースに新しいレコードを追加します。

DB::table('users')->insert([
    'name' => 'John Doe',
    'email' => 'johndoe@example.com',
    'password' => bcrypt('password'),
]);

データの更新

既存のレコードを更新します。

DB::table('users')
    ->where('id', 1)
    ->update(['name' => 'Jane Doe']);

データの削除

特定のレコードを削除します。

DB::table('users')->where('id', 1)->delete();

クエリビルダーの機能

条件付きクエリ

whereメソッドを使って条件付きクエリを簡単に構築できます。

// 単一条件
$users = DB::table('users')->where('status', 'active')->get();

// 複数条件
$users = DB::table('users')
    ->where('status', 'active')
    ->where('age', '>', 25)
    ->get();

orWhereも使用可能です。

// OR条件
$users = DB::table('users')
    ->where('status', 'active')
    ->orWhere('role', 'admin')
    ->get();

集計関数

クエリビルダーは、SQLの集計関数も簡単に使えます。

// 件数を取得
$count = DB::table('users')->count();

// 最大値を取得
$max = DB::table('orders')->max('price');

// 平均値を取得
$avg = DB::table('users')->avg('age');

結合

joinメソッドを使って複数のテーブルを結合できます。

$users = DB::table('users')
    ->join('posts', 'users.id', '=', 'posts.user_id')
    ->select('users.name', 'posts.title')
    ->get();

ソート・並び替え

データを並び替えるには、orderByを使用します。

$users = DB::table('users')
    ->orderBy('name', 'asc')
    ->get();

リミット・オフセット

レコード数を制限したり、スキップして取得することができます。

// 最初の10件のみ取得
$users = DB::table('users')->limit(10)->get();

// 5件スキップして次の10件を取得
$users = DB::table('users')->offset(5)->limit(10)->get();

クエリビルダーの強力な機能

サブクエリ

サブクエリを使って、より複雑なクエリを構築できます。

$latestPosts = DB::table('posts')
    ->select('user_id', DB::raw('MAX(created_at) as latest_post'))
    ->groupBy('user_id');

$users = DB::table('users')
    ->joinSub($latestPosts, 'latest_posts', function ($join) {
        $join->on('users.id', '=', 'latest_posts.user_id');
    })
    ->get();

条件付きクエリのグループ化

where条件をグループ化して、より柔軟なクエリを構築できます。

$users = DB::table('users')
    ->where('role', 'admin')
    ->orWhere(function($query) {
        $query->where('status', 'active')
              ->where('age', '>', 30);
    })
    ->get();

トランザクションのサポート

複数のデータベース操作をトランザクションとしてまとめて実行し、

途中で失敗した場合に全ての変更をロールバックできます。

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);
    DB::table('posts')->delete();
});

クエリビルダーの利点と欠点

利点

  • パフォーマンス: ORMであるEloquentに比べ、直接SQLに近いためパフォーマンスが高いことがあります。
  • 柔軟性: Eloquentが持つようなモデル層を介さず、柔軟にクエリを構築できるため、特殊なデータベース構造にも対応しやすい。
  • SQLインジェクションの防止: クエリビルダーは自動的にプレースホルダを使うため、SQLインジェクションのリスクが低い。

欠点

  • モデルの機能がない: Eloquentで提供される便利なメソッド(リレーションやスコープ、アクセサ、ミューテータなど)が利用できないため、複雑なビジネスロジックを実装する際にはやや不便です。
  • 複雑なロジックの実装: 複雑なデータ操作やリレーションを扱う場合、Eloquentほど直感的ではなくなる可能性があります。

まとめ

LaravelのQuery Builderは、パフォーマンスを重視した軽量なデータベース操作が求められる場合に非常に有効です。

基本的なCRUD操作から複雑なクエリまで幅広い操作ができ、

Eloquentに比べて柔軟性がありながらも、

SQLインジェクションのリスクを軽減する安全な構文を提供します。

タイトルとURLをコピーしました