Критерии поиска по нескольким параметрам Laravel - PullRequest
1 голос
/ 21 марта 2019

Этот поиск работает для меня только тогда, когда я правильно заполняю все поля. Я хочу, чтобы при заполнении только одного поля я исключал результаты, относящиеся только к этому полю. Пример, если я заполняю только поле 'mark' с помощью 'Audi', получилось мое имя mark. Моя функция в настоящее время возвращает результаты, только если все поля заполнены. Если я заполняю одно поле, он возвращает пустой массив. Кроме того, я не уверен, хорошо ли написана эта функция, я следовал руководству. Смотреть код:

public function searchFilterCar(Request $request, Car $car){
    if($request->has('car_type')){
        if($request->has('mark')){
            if($request->has('model')){
                if($request->has('fuel')){
                    if($request->has('circuit')){
                        return $car->where('car_type', $request->input('car_type'))
                                    ->where('mark', $request->input('mark'))
                                    ->where('model', $request->input('model'))
                                    ->where('fuel', $request->input('fuel'))
                                    ->where('circuit', $request->input('circuit'))
                                    ->get();
                    }
                }
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Разделите условия на несколько операторов if, где where работает с существующими результатами, так что вы продолжите с предыдущего where. Это должно выглядеть примерно так:

    if($request->has('car_type')){
        $car = $car->where('car_type', $request->input('car_type'));
    }

    if($request->has('mark')){
        $car = $car->where('mark', $request->input('mark'));
    }

    ....

    return $car->get();

Может показаться немного грубым, но это уменьшает размер блока кода и работает

0 голосов
/ 21 марта 2019

Другим способом, похожим на ответ Khaldoun Nd, было бы использование условных запросов.Это позволяет удалить последующие операторы if.

Код станет примерно таким:

return $car
    ->when($request->car_type, function ($query, $type) {
        return $query->where('car_type', $type);
    })
    ->when($request->mark, function ($query, $mark) {
        return $query->where('mark', $mark);
    })
    // Chain the other conditions like the previous ones...
    ->get();

Для справки: https://laravel.com/docs/5.8/queries#conditional-clauses

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...