where句のグループ化
以前入っていた現場で
select * from users
where ((status = 1) and (confirm_email1 = ? or confirm_email2 = ? or confirm_email3 = ?))
or ((status = 2) and (approve_email1 = ? or approve_email2 = ? or approve_email3 = ?))
上記のようなSQL文をLaravelで再現する必要がありました。(実際のコードから修正してあります)
そして私が最初に書いたコードはこんな感じでした。
$users =  User::query()
    ->Where('status', 1)
    ->orWhere('confirm_email1', $email)
    ->orWhere('confirm_email2', $email)
    ->orWhere('confirm_email3', $email)
    ->orWhere('status', 2)
    ->orWhere('approve_email1', $email)
    ->orWhere('approve_email2', $email)
    ->orWhere('approve_email3', $email)
絶対こんなコードではデータを取得できないよなと思いつつもこんなコードしか書けなかったです。。。。
色々調べていく中でwhereメソッドにクロージャを渡してグループ化できることを知りました。
そして進化したコードがこちらです!
$users =  User::query()
    ->where(function($query) use ($email) {
        $query->where(function($query) use ($email) {
            $query->Where('status', 1);
        })->where(function($query) use ($email) {
            $query->orWhere('confirm_email1', $email)
                  ->orWhere('confirm_email2', $email)
                  ->orWhere('confirm_email3', $email);
        });
    })
    ->orwhere(function($query) use ($email) {
        $query->where(function($query) use ($email) {
            $query->Where('status', 2);
        })->where(function($query) use ($email) {
            $query->orWhere('approve_email1', $email)
                  ->orWhere('approve_email2', $email)
                  ->orWhere('approve_email3', $email);
        });
    })
    ->get();
このコードを書いてうまくデータを取得できたときは少し感動しました。
参考にしたサイトはこちらです
Laravel readouble, 論理グループ化