Laravel7 A and ((B and C) or (D and E))の書き方

たとえば、こんなwhere句

WHERE
    `A` = 1 AND 
    (
        (
            `B` = 1 AND 
            `C` = 1
        ) OR  
        (
            `D` = 1 AND 
            `E` = 1
        )
    )

クエリビルダで書くと

        $members = Member::where('A', '=', 1)
            ->where(function($query){
                $query->where(function($query){
                    $query->where('B', '=', 1)
                        ->where('C', '=', 1);
                })
                    ->orWhere(function($query){
                        $query->where('D', '=', 1)
                            ->where('E', '=', 1);

                    });
            })
            ->get();

つまり、SQLでカッコで囲む('(‘ ~ ’)’)部分を、クロージャにすればOK。
面倒くさいけど、落ち着いてやれば難しいことではない。

変数を使いたい場合は、useで渡してやればOK。

        $members = Member::where('A', '=', $a)
            ->where(function($query) use($b, $c, $d, $e){
                $query->where(function($query) use($b, $c){
                    $query->where('B', '=', $b)
                        ->where('C', '=', $c);
                })
                    ->orWhere(function($query) use($d, $e){
                        $query->where('D', '=', $d)
                            ->where('E', '=', $e);

                    });
            })
            ->get();

しかし、正直なところホント面倒くさい。。。
SQL書くより10倍時間がかかるし面倒くさい。。。
個人的にはクエリビルダなくなって欲しい。。。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です