【Laravel】クエリビルダを使ってテーブル結合する方法を解説

Laravelは、PHPのフレームワークの中でも特に人気が高く、開発効率を大幅に向上させることができます。その中でも、クエリビルダは、データベースクエリを直感的かつ柔軟に記述できる非常に強力なツールです。基本的なクエリ操作を学んだあと、テーブルのジョインや、集計クエリといった応用的な操作をマスターすることで、Laravelのデータベース操作がさらに高度になります。

本記事では、クエリビルダの基本を踏まえたうえで、より応用的なクエリの書き方や実践的なテクニックを紹介します。これにより、複雑なデータ取得や操作をシンプルかつ効率的に行えるようになり、開発の質を一層向上させることができるでしょう。

クエリビルダの基本的な使い方は、こちらで解説をしています。
ご覧いただけると幸いです。

この記事では、以下のようなクエリビルダの使い方を解説していきます。

  • ジョインを使った複数テーブルの結合
  • 集計クエリによるデータの集計と分析

ジョイン(JOIN)クエリの活用

データベースにおけるジョイン(JOIN)は、複数のテーブルを結合し、それらのテーブル間の関連データを取得するために使用されます。Laravelのクエリビルダでは、join() メソッドを使用して、SQLのJOIN機能を簡単に実装できます。ここでは、基本的なジョインから応用的な使い方までを解説していきます。

内部結合(INNER JOIN)

まず、2つのテーブルを結合する基本的な方法を見ていきましょう。下記のようなusersテーブルと、ordersテーブルを例に解説します。

usersテーブル

ordersテーブル

users テーブルとorders テーブルをuser_id で結合し、ユーザとその注文情報を取得するクエリは以下のように書けます。

$orders = DB::table('orders')
    ->join('users', 'orders.user_id', '=', 'users.id')
    ->select('users.name', 'orders.product_name', 'orders.quantity', 'orders.price')
    ->get();

結果は次のようになります。

このクエリでは、orders テーブルとusersテーブルを user_idid をもとに結合しています。SQLのINNER JOINと同様の結果が得られます。

外部結合(LEFT JOIN)

LEFT JOINを使うことで、結合先のデータが存在しない場合でも実行結果に含めることができます。クエリビルダではleftJoin() を使うことで実現できます。

$orders = DB::table('orders')
    ->leftJoin('users', 'orders.user_id', '=', 'users.id')
    ->select('orders.*', 'users.name')
    ->get();

このクエリでは、orders テーブルとusers テーブルをuser_idid をもとに結合しています。対応するユーザが存在しない場合は、usersname に当たるデータがNULLになります。

条件付きジョイン

さらにジョインに条件を追加して、特定の条件に基づく結合も可能です。例えば、users テーブルの status がアクティブなユーザだけを対象にジョインを行うには、以下のように書きます。

$orders = DB::table('orders')
    ->join('users', function ($join) {
        $join->on('orders.user_id', '=', 'users.id')
             ->where('users.status', '=', 'active');
    })
    ->get();

このクエリは、orders テーブルとusersテーブルを user_id で結合しつつ、 users.sutatusactiveのユーザに限定してデータを取得しています。 join() 内で where() を使うことで、結合対象の条件を詳細に指定できます。

結果は以下のようになります。

usersstatusactive となっているデータのみ対象に結合されていることがわかります。

集計クエリの利用

集計クエリは、データを分析し、統計情報を取得するために非常に便利です。Laravelのクエリビルダでは、count()sum()avg()max()min()といった集計関数を簡単に利用できます。ここでは、集計クエリの基本的な使い方から応用的なテクニックを紹介します。

データのカウント(COUNT)

データベースのレコード数を取得する場合には、count()を使用します。orders テーブルのレコード数を取得するには次のように記述します。

$totalOrders = DB::table('orders')->count();

このクエリは、orders テーブル内のすべての注文数を返します。

また、条件付きでカウントを行うことも可能です。たとえば、特定のユーザの注文数をカウントする場合、以下のように書きます。

$userOrders = DB::table('orders')->where('user_id', 1)->count();

合計を取得する(SUM)

合計値を取得する場合は、sum() を使います。例えば、orders テーブルのprice カラムの合計を取得するには以下のようにします。

$totalRevenue = DB::table('orders')->sum('price');

特定の条件に基づいて合計を取得することもできます。たとえば、user_id が1 のユーザのpriceを取得するには次のようにします。

$userRevenue = DB::table('orders')->where('user_id', 1)->sum('price');

平均値を取得する(AVG)

平均値を取得するには、avg() メソッドを使用します。たとえば、すべてのprice の平均値を取得するには次のように書きます。

$averagePrice = DB::table('orders')->avg('price');

最大値・最小値を取得する(MAX / MIN)

最大値を取得するには、max()、最小値を取得するにはmin() を使用します。たとえば、orders テーブル内でpriceが最も高いものを取得する場合は次のように書きます。

$maxPrice = DB::table('orders')->max('price');

逆に、priceが最も低いものを取得する場合は次のように書きます。

$minPrice = DB::table('orders')->min('price');

グループ化クエリ(GROUP BY)

groupBy() を使うことで、データを特定のカラムでグループ化し、集計を行うことができます。例えば、注文情報をまとめたorders テーブルで、ユーザごとの注文数を取得するような場合には、次のように書きます。

$userOrders = DB::table('orders')
    ->select(DB::raw('user_id, count(*) as total_orders'))
    ->groupBy('user_id')
    ->get();

条件付き集計(HAVING)

groupBy() を使った集計の後に、特定の条件で結果をフィルタリングしたい場合、having() を使います。例えば、注文数が2件以上のユーザを取得するには次のように書きます。

$userOrders = DB::table('orders')
    ->select(DB::raw('user_id, count(*) as total_orders'))
    ->groupBy('user_id')
    ->having('total_orders', '>=', 2)
    ->get();

まとめ

この記事では、Laravelのクエリビルダを使った応用的なクエリの書き方を詳しく解説しました。クエリビルダは、データベース操作を効率的かつ直感的に行うための強力なツールであり、基本的なクエリだけでなく、より複雑なクエリにも対応できます。

今後は、この記事で紹介した応用的なクエリの使い方を実際のプロジェクトで試してみて、クエリビルダを活用した効果的なデータ操作を実感してください。

コメント