AI要約
- orWhereメソッドは、複数の条件のいずれかを満たすレコードを取得します
- 基本的な使い方では、statusがactiveまたはroleがadminのユーザーを取得します
- 複数のorWhereを連続して使用して、さらに多くの条件を追加できます
- クロージャを使うと、複雑な条件をグループ化してネストできます
- SQLのOR条件は、左辺がTRUEの場合、右辺の評価をスキップする短絡評価を行います
はじめに
orWhereを使ってると何やら評価されていない条件があると感じたので調べたら条件分岐のORと同じ評価基準なんですね
せっかくですのでorWhereの使い方と評価基準についてまとめてみましたのでぜひご覧ください!
orWhereメソッドの基本的な使い方
orWhereメソッドを使用すると、複数の条件のうちどれか一つでも満たすレコードが取得できます
基本的なorWhereの使用
$users = User::where('status', 'active')
->orWhere('role', 'admin')
->get();
このクエリは、statusがactiveであるか、roleがadminであるユーザーを取得します
SQLに変換すると次のようになります
SELECT * FROM users WHERE status = 'active' OR role = 'admin';
複数の条件を組み合わせる
orWhereを使用して複数の条件を組み合わせることもできます
また、クロージャを使ってネストされたorWhere条件を追加することも可能です
複数のorWhereを連続して使用
$users = User::where('status', 'active')
->orWhere('role', 'admin')
->orWhere('created_at', '>', now()->subDays(30))
->get();
このクエリは、次のいずれかの条件を満たすユーザーを取得します
-
statusがactiveである - または
roleがadminである - または
created_atが過去30日以内である
SQLに変換すると次のようになります
SELECT * FROM users WHERE
status = 'active'
OR role = 'admin'
OR created_at > NOW() - INTERVAL 30 DAY;
クロージャを使ったネストされた条件
$users = User::where('status', 'active')
->orWhere(function ($query) {
$query->where('role', 'admin')
->Where('created_at', '>', now()->subDays(30));
})
->get();
このクエリは、次のいずれかの条件を満たすユーザーを取得します
-
statusがactiveである -
rorleがadminであり、かつcreated_atが過去30日以内である
SQLに変換すると次のようになります
SELECT * FROM users WHERE
status = 'active'
OR (role = 'admin' AND created_at > NOW() - INTERVAL 30 DAY);
SQLの評価論理におけるORの挙動
SQLにおけるWHERE句のOR条件は、通常の論理評価に準拠しています
これは、左辺がTRUEの場合、右辺の評価がスキップされることになります(短絡評価)
さきほどのクエリを見てみます
SELECT * FROM users WHERE status = 'active' OR role = 'admin';
このクエリは、statusがactiveの場合、その行は即座にTRUEと評価されるため、role = 'admin'の評価は行われません
同様にstatusがactive出ない場合のみ、role = 'admin'の評価が行われます
まとめ
EloquentのorWhereメソッドを使用すると、複数の条件のいずれかを満たすレコードを取得できます
複雑な条件を扱う場合、クロージャを使って条件をグループ化できます
また、SQLのOR条件は左辺がTRUEの場合、右辺の評価がスキップされるようになりますのでクエリを組み立てる際は注意が必要になってきます