这种多重可选过滤器的最佳解决方案是什么?

Ami*_*man 0 php mysql laravel laravel-5

这些都是可选字段,所以我是否必须编写多个带条件的查询,或者有什么方法可以使用 Laravel 来处理这个问题?查询会是什么样子?

谢谢

在此输入图像描述

Nam*_*hek 5

这在一定程度上取决于过滤器的提交方式,但您可以执行以下两件事之一(可能还有更多......):

public function listCars(Request $request)
{
    $cars = Car::when($request->get('make'), function ($query, $make) {
            $query->where('make', $make);
        })
        ->when($request->get('model'), function ($query, $model) {
            $query->where('model', $model);
        })
        ->...
        ->get();

    // do what you have to do
}
Run Code Online (Sandbox Code Playgroud)

因此,您基本上将查询构建器调用包装在 中when($value, $callback),只有在计算结果为 true$callback时才会执行$value。当您使用 检索未设置的参数时$request->get('parameter'),它将返回 null 并且回调不会执行。但要注意,如果$value是的0话也不会执行回调。所以请确保您没有将此作为索引。

作为替代方案,您也可以做同样的事情,但用不太雄辩的表达方式......

public function listCars(Request $request)
{
    $query = Car::query();

    if($request->filled('make')) {
        $query->where('make', $request->get('make'));
    }
    if($request->filled('model')) {
        $query->where('model', $request->get('model'));
    }

    // some more filtering, sorting, ... here

    $cars = $query->get();

    // do what you have to do
}
Run Code Online (Sandbox Code Playgroud)