Laravel の Query Builder は、データベースに対する柔軟で効率的な操作を提供するツールです。SQL クエリを簡単かつ直感的に構築するための方法を提供し、Laravel の Eloquent ORM と併用することもできますが、より複雑なクエリや動的なクエリ構築が必要な場合に非常に有用です。この記事では、Laravel の Query Builder を使ったデータベース操作の基本から応用までを包括的に解説します。
Query Builder の基本的な使用方法
Laravel の Query Builder は、DB
ファサードを通じてアクセスできます。まずは基本的な構文を紹介します。

1. 単純な SELECT クエリ
データベースからデータを取得する最も基本的な操作は、select
メソッドを使用することです。これを使うことで、特定のカラムを選択してデータを取得できます。
php$users = DB::table('users')->select('id', 'name')->get();
上記の例では、users
テーブルから id
と name
のカラムだけを取得しています。この get()
メソッドは、クエリの実行結果をコレクションとして返します。
2. WHERE 条件の指定
データをフィルタリングするには、where
メソッドを使用します。これは SQL の WHERE
句と同じ機能を提供します。
php$users = DB::table('users')->where('status', 'active')->get();
この例では、status
カラムが 'active'
のレコードを取得します。where
メソッドにはさまざまなバリエーションがあり、複数の条件を組み合わせて使うこともできます。
php$users = DB::table('users')
->where('status', 'active')
->where('age', '>', 18)
->get();
3. 条件の組み合わせ
複数の条件をグループ化するには、クロージャを使用して条件をまとめます。例えば、特定の status
が 'active'
または 'pending'
であるユーザーを取得する場合です。
php$users = DB::table('users')
->where(function($query) {
$query->where('status', 'active')
->orWhere('status', 'pending');
})
->get();
4. データの挿入(INSERT)
新しいレコードを挿入する場合、insert
メソッドを使用します。
phpDB::table('users')->insert([
'name' => 'John Doe',
'email' => 'johndoe@example.com',
'status' => 'active'
]);
複数のレコードを一度に挿入することもできます。
phpDB::table('users')->insert([
['name' => 'Jane Doe', 'email' => 'janedoe@example.com', 'status' => 'active'],
['name' => 'Sam Smith', 'email' => 'samsmith@example.com', 'status' => 'inactive']
]);
5. 更新(UPDATE)
既存のレコードを更新するには、update
メソッドを使用します。
phpDB::table('users')
->where('id', 1)
->update(['status' => 'inactive']);
この例では、id
が 1
のユーザーの status
を 'inactive'
に変更します。
6. 削除(DELETE)
レコードを削除するには、delete
メソッドを使用します。
phpDB::table('users')->where('id', 1)->delete();
id
が 1
のユーザーを削除します。複数のレコードを一度に削除することもできます。
phpDB::table('users')->where('status', 'inactive')->delete();
より高度なクエリ操作
1. JOIN 操作
複数のテーブルを結合するには、join
メソッドを使用します。これを使うと、関連するテーブルからデータを結合して取得できます。
php$users = DB::table('users')
->join('posts', 'users.id', '=', 'posts.user_id')
->select('users.name', 'posts.title')
->get();
この例では、users
テーブルと posts
テーブルを user_id
で結合し、users.name
と posts.title
を取得しています。
2. サブクエリ
サブクエリを使用して、さらに複雑なクエリを実行することができます。
php$users = DB::table('users')
->whereIn('id', function($query) {
$query->select('user_id')
->from('posts')
->where('status', 'active');
})
->get();
この例では、posts
テーブルから status
が 'active'
の user_id
を取得し、それに基づいて users
テーブルから該当するユーザーを取得します。
3. 集計関数
count
、sum
、avg
、min
、max
などの集計関数を使うことで、統計的なデータを取得できます。
php$count = DB::table('users')->where('status', 'active')->count();
$maxAge = DB::table('users')->max('age');
$averageAge = DB::table('users')->avg('age');
これらの関数は、SQL の集計関数に相当し、データベース内で集計処理を行います。
Query Builder と Eloquent の違い
Laravel では、Query Builder
と Eloquent ORM
の二つの方法でデータベースを操作できます。Query Builder
は、特に複雑なクエリを構築したい場合に便利ですが、Eloquent
は、モデルとデータベーステーブルを関連付けることで、より直感的にデータベース操作を行えます。
-
Query Builder は、データベース操作をより自由に行うことができます。
-
Eloquent は、モデルと関連付けることで、オブジェクト指向的にデータを操作できます。
例えば、Eloquent では次のように操作します。
php$users = User::where('status', 'active')->get();
クエリのパフォーマンス最適化
大量のデータを扱う場合、パフォーマンスの最適化が重要です。Query Builder
では、chunk
メソッドを使って、データを少しずつ処理できます。
phpDB::table('users')->where('status', 'active')->chunk(100, function($users) {
foreach ($users as $user) {
// データ処理
}
});
この方法で、メモリ消費を抑えつつ、大量のデータを効率的に処理することができます。
まとめ
Laravel の Query Builder は、データベース操作を簡単に行える非常に強力なツールです。select
、where
、insert
、update
、delete
などの基本的な操作から、join
、subqueries
、集計関数、そしてパフォーマンス最適化に至るまで、さまざまな方法でデータベースを操作できます。これにより、SQL を直接書くことなく、高度なクエリを簡単に構築することができ、Laravel アプリケーションの開発を効率化できます。