将多个过滤器应用于Laravel 5中的表

时间:2016-08-05 16:37:21

标签: mysql laravel eloquent laravel-5.2

我有车辆表。在我的车辆搜索页面中,我根据所选的型号,颜色等过滤车辆。

在我的代码中,我试图实例化车辆模型。然后将过滤器应用到它并尝试使用get()运行查询,但是给我提供了错误。

代码在这里:

    $vehicles = Vehicle::all();
    if($request->input('model'))
    {
        $vehicles->whereHas('model', function($q)
        {
            $q->where('model_name', '=', 'CL');

        });

    }
    if($request->input('color'))
    {
        $vehicles->where('color', '=', 'red');
    }
    // other filters here
    $result = $vehicles->get();
    dd($result);

如果我直接在Vehicle模型上使用whereHas(例如Vehicle :: whereHas()),那么单个过滤器就可以工作。如果我必须根据条件应用多个过滤器,那么解决方案是什么? 谁救了我的一天:)

3 个答案:

答案 0 :(得分:3)

所以你需要做的就是拥有一个包含过滤器的$conditions数组,例如:

$conditions = collect([]);
$conditions->push($request->only(['model_name', 'color', 'year', 'valueMin', 'valueMax']'));

这会使collection只包含key => valuemodel, color, year, valueMin属性中的valueMax对(可能来自某种形式?)

然后,您只需将该集合传递给您的查询,如下所示:

Vehicle::where(function($q) use ($conditions){
    if ($conditions->has('color')) {
        $q->where('color', $conditions->get('color'));
    }

    return $q;
})->whereHas('model', function($q) use ($conditions) {
    return $q->where($conditions->toArray());
})->get();

通过这种方式,您无需担心在查询中对条件进行硬编码,并且可以拥有永无止境的限制。在进行直接比较时,您只需要传入一个带有键值对的数组。

此解决方案将允许您正在寻找的动态属性比较。

答案 1 :(得分:1)

试试这个:

 $vehicles = new Vehicle();
        if($request->input('model'))
        {
           $vehicles =  $vehicles->whereHas('model', function($q)
            {
                $q->where('model_name', '=', 'CL');

            });

        }
        if($request->input('color'))
        {
           $vehicles = $vehicles->where('color', '=', 'red');
        }
        // other filters here
        $result = $vehicles->get();
        dd($result);

答案 2 :(得分:0)

我不认为$vehicles = Vehicle::all();是首先加载数据并应用过滤器的最佳方式。这可能会影响大量记录的性能,因为您正在加载表中的所有数据,包括不必要的记录。

请尝试以下多种情况:

$vehicles = Vehicle::where(['model_name'=>'CL','color'=>'red'])->get(); //color is just an assumption. This way you can use multiple conditions.
dd($vehicles);

我希望这会有所贡献......