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
の場合、右辺の評価がスキップされるようになりますのでクエリを組み立てる際は注意が必要になってきます