答案 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且不执行回调。但是请注意,如果$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
}
答案 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,
}