【Laravel8】A and (B or C) and Bの複雑なand/or検索を実行する。

ほい、今回は複雑なand/or検索をLaravelのクエリービルダーを使って行おうと思います!

簡単な書き方はわかっても、少し複雑になるとSQLで書けてもほかの書き方わからなかったりなりますよね~

伝えたいこと: 少し複雑なSQLをクエリビルダーで書けるようになる。

今回の目的はクエリビルダーで【A and (B or C) and B】見たいな入れ子のSQLをクエリビルダーで書きます!

なので簡単なものだったらかけるけど、少し複雑になるとクエリビルダーで書くのがわからない~って方はこの記事で簡単ですが、解決できると思います。

今回は以下を参考にしました。

解決したいこと

今回はSQLで以下のようなコードがあるときにクエリビルダーでも書けるようにしたいと思います。

SELECT 
  * 
FROM 
  user 
WHERE 
  prefecture = '東京' 
  AND (
    city = '新宿区' 
    OR city = '渋谷区'
  ) 
  AND club = 'soccer'Code language: JavaScript (javascript)

ちなみにデータのイメージはこちら↓

IDnameprefecturecityclub
1山田東京新宿区baseball
2田中東京渋谷区soccer
3佐藤大阪北区soccer
4鈴木名古屋baseball
5高島東京品川区soccer
6大宮東京新宿区soccer

SQLの条件は以下となるはずです。
全ての条件に当てはまる人を取得したいです。

  • prefectureが東京
  • cityが新宿区か渋谷区
  • clubがsoccer

ではどうして対象のレコードを取得できるのでしょうか。

解決方法

クエリビルダーで入れ子の書き方を使いましょう。

ということで以下のように書きます!

$result = DB::table('user')
    ->where('prefecture', '東京')
    ->where(function($query){
        $query->orwhere('city', '新宿区')
            ->orwhere('city', '渋谷区');
    })
    ->where('club', 'soccer')
    ->get();Code language: PHP (php)

こんな感じです!

意外と簡単に解決できましたね~

入れ子の書き方はこうして書いていくわけですね。

ちなみにここで書いているfunctionのところですが、無名関数となっているので、引数を渡す場合には以下のように書いてください。

$city01 = '渋谷区';
$city02 = '新宿区';

$result = DB::table('user')
    ->where('prefecture', '東京')
    ->where(function($query) use($city01, $city02){
        $query->orwhere('city', $city01)
            ->orwhere('city', $city02);
    })
    ->where('club', 'soccer')
    ->get();Code language: PHP (php)

*注意*

変数名がダメなので、こんな$city01,$city02みたいなつけ方はしてはいけません。と、思います。

まとめ

今回は少し複雑なSQLをクエリビルダーで書くようにしてみました。

ただこれが複雑といっていたらキリがなくなるので、初歩的にこんな感じで書く!

っていうのを理解していけば応用も聞いてきやすいかなと思います!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA