我有车辆表。在我的车辆搜索页面中,我根据所选的型号,颜色等过滤车辆。
在我的代码中,我试图实例化车辆模型。然后将过滤器应用到它并尝试使用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()),那么单个过滤器就可以工作。如果我必须根据条件应用多个过滤器,那么解决方案是什么? 谁救了我的一天:)
答案 0 :(得分:3)
所以你需要做的就是拥有一个包含过滤器的$conditions
数组,例如:
$conditions = collect([]);
$conditions->push($request->only(['model_name', 'color', 'year', 'valueMin', 'valueMax']'));
这会使collection
只包含key => value
和model, 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);
我希望这会有所贡献......