ほい、今回は複雑なand/or検索をLaravelのクエリービルダーを使って行おうと思います!
簡単な書き方はわかっても、少し複雑になるとSQLで書けてもほかの書き方わからなかったりなりますよね~
Table of Contents
伝えたいこと: 少し複雑な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)
ちなみにデータのイメージはこちら↓
ID | name | prefecture | city | club |
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をクエリビルダーで書くようにしてみました。
ただこれが複雑といっていたらキリがなくなるので、初歩的にこんな感じで書く!
っていうのを理解していけば応用も聞いてきやすいかなと思います!