Вложенный или где-то в одном, где - Laravel - PullRequest
2 голосов
/ 06 марта 2020

Мне нужно создать запрос в Laravel 6, который вложил бы запрос "где находится" в запрос "где". например: выберите * ОТ примера, где k = 5 и ((i = 1 и j = 2) или (i = 3 и j = 4) или (i = 5 и j = 4) ......)

Я попробовал код ниже

                $getItems = $getItems->where(function ($query) use($codes,$cID) {
                        $query->orWhere(function ($query1) use ($codes, $cID) {
                            foreach($codes[$cID] as $code) {
                                $query1
                                    ->where('code', $code)
                                    ->where('cid', $cID);
                            }
                        });
                });

, но результат неправильный.

and (("code" = ? and "cid" = ?)) and (("code" = ? and "cid" = ?)) and (("code" = ? and "cid" = ?))....

Я не понимаю, почему он добавляет 2 скобки в каждом foreach l oop и почему он добавляет «и» вместо «или». Любые предложения о том, как построить это?

1 Ответ

1 голос
/ 06 марта 2020

Вы должны иметь такую ​​структуру:

Model::where('k', 5)->where(function($q){
        $q->orWhere(function($q){
            $q->where('i', 1)->where('j', 2);
        })->orWhere(function($q){
            $q->where('i', 3)->where('j', 4);
        })->orWhere(function($q){
            $q->where('i', 5)->where('j', 4);
        });
    })->toSql();

> select * from `table` where `k` = ? and ((`i` = ? and `j` = ?) or (`i` = ? and `j` = ?) or (`i` = ? and `j` = ?))

Таким образом, ваш запрос должен быть:

$getItems->where('k', 5)
    ->where(function ($query) use($codes, $cID) {
        foreach($codes[$cID] as $code) {
            $query->orWhere(function ($query1) use ($code, $cID) {
                $query1->where('code', $code)->where('cid', $cID);
            });
        }
    });
...