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

时间:2018-07-18 05:55:49

标签: php mysql laravel laravel-5

这些都是可选字段,因此我将不得不编写带有条件的多个查询,还是有什么方法可以使用Laravel处理呢?查询将是什么样子?

谢谢

enter image description here

3 个答案:

答案 0 :(得分:4)

这在某种程度上取决于过滤器的提交方式,但是您可以执行以下两项操作之一(可能还有更多的工作...):

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
}

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

作为替代方案,您也可以做同样的事情,但是用更少的口才来表达……

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
}

答案 1 :(得分:1)

这是我在我的应用中遇到的类似查询的有效示例。

   $filters = $vehicle->newQuery();

    if (!empty($request->make)) {
        $filters->where('make_id', $request->make);

    }
    if (!empty($request->carmodel)) {
        $filters->where('carmodel_di', $request->carmodel);

    }
    if (!empty($request->year)) {
        $filters->where('year_id', $request->year);

    }
    if (!empty($request->engine)) {
        $filters->where('engine_id', $request->engine);

    }

    if (!empty($request->price)) {
        $filters->where('price_id', $request->price);

    }

    $cars = $filters->latest()->paginate(50);

,现在按下 $ cars 变量进行查看。我希望这对您有用,或者至少为您提供有关操作方法的想法

答案 2 :(得分:1)

这是一种简单的方法,您也可以在->when()条件内使连接成为条件,如果您使用的是Laravel版本> 5.4,则使用$request>filled()代替$request->has()

    public function listCars(Request $request)
{
    $cars = Car::when($request->has('make'), function ($query)use($request) {
            $query->join('maker','car.makerId','=','maker.id')
            ->where('make', $request->input('make'));
        })
        ->when($request->has('model'), function ($query)use($request) {
            $query->where('model', $request->input('model'));
        })
        ->...
        ->get();

    // you can even make the join conditionaly, 
}