エンジニアのひよこ_level10

【毎日更新!】新卒4年目エンジニアブログです!

【Laravel】クエリビルダのorWhereは順番に注意【796日目】

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

で判定が異なるから。

うっかりバグにつながったりするので注意しましょうφ(・