基于少量参数Laravel的搜索条件

时间:2019-03-21 11:14:39

标签: php mysql laravel search eloquent

仅当我正确填写所有字段时,此搜索才对我有用。我希望当我仅填写一个字段时,将排除仅与该字段相关的结果。 例如,如果我仅用“ 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 个答案:

答案 0 :(得分:1)

将条件分成多个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();

它可能看起来有些粗糙,但是它减小了代码块的大小并且可以正常工作

答案 1 :(得分:0)

与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