orWhereを何も考えずに書いた悲劇
何気なく書いたクエリビルダ。
何も考えずに書いたorWhere。そこに悲劇が。
orWhereの順番を入れ替えてみた
\App\Models\User::select('id', 'name') ->where('status_id', 1) ->orWhere('id', 2) ->where('status_id', 3) ->toSql();
\App\Models\User::select('id', 'name') ->where('status_id', 1) ->where('status_id', 3) ->orWhere('id', 2) ->toSql()
orWhereの位置が違うが、このSQLは一緒か。
SQLの結果
"select `id`, `name` from `users` where (`status_id` = ? or `id` = ? and `status_id` = ?) and `users`.`deleted_at` is null" "select `id`, `name` from `users` where (`status_id` = ? and `status_id` = ? or `id` = ?) and `users`.`deleted_at` is null"
一緒ではない。取得出来る結果も違う。
なぜなら
A or (B and C) (A and C) or B
で判定が異なるから。
うっかりバグにつながったりするので注意しましょうφ(・・