QueryBuilderで、WHERE句のANDやORをネストする方法についてご紹介します。

LaravelでSQLを記述

Laravelで、SQLを記述する場合、基本的にはQueryBuilderを使用します。
その際、WHERE句のANDやORが入れ子構造になったSQLが必要になることがよくあります。

SQLを使用した場合

例えば、東京都か神奈川県に在住している、20才以上のユーザを抽出したい場合。

SELECT * FROM users WHERE (pref = '東京都' OR pref = '神奈川県') AND age >= 20;

となります。※usersテーブルは架空のものです。

QueryBuilderを使用した場合

DB::table('users')
    ->where(function($query)
    {
        $query->where('pref', '=', '東京都')
              ->orWhere('pref', '=', '神奈川県');
    })
    ->where('age', '>=', 20)
    ->get();

ポイントは、whereメソッドの引数に、無名関数を使用する点です。
この無名関数内で、引数(例では$query)を使って記述した内容は、SQLを生成する際に”(“と”)”で括られるイメージになります。
上記のQueryBuilder文を、疑似的にSQLとして表現すると下記のようになります。

FROM users
    WHERE (
        pref = '東京都'
	OR pref = '神奈川県'
    )
    AND WHERE age >= 20
SELECT * 

見比べたところわかりやすくなっています。
【おすすめ記事】
【初心者歓迎】PHP学習で人気のプログラミングスクール
バックエンドエンジニアおすすめ!PHPの学習サイト9つ
PHPの本・参考書の評判