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

s5a0g9ez  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(284)

这些都是可选字段,所以我需要编写多个带条件的查询,还是有任何方法可以使用laravel来处理这个问题?查询将是什么样的?
谢谢

efzxgjgh

efzxgjgh1#

这里是一个类似的查询我在我的应用程序工作的例子。

$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变量查看。我希望这对你有用,或者至少给你一个如何继续的想法

hec6srdp

hec6srdp2#

这在一定程度上取决于过滤器是如何提交的,但是您可以做以下两件事之一(可能还有更多……):

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
}

因此,您基本上是在 Package 查询生成器调用 when($value, $callback) ,只执行 $callback 如果 $value 计算结果为true。检索未设置的参数时 $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
}
mcvgt66p

mcvgt66p3#

下面是一个简单的方法,您还可以在 ->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, 

}

相关问题