我正在尝试为某些产品实施过滤方法。
这是路线:
Route::get('/TVs/{type?}/{producer?}', 'Product\AllProducts@getTVs')->where(['type' => '4kTV|curved|lcd|oled|plasma'], ['producer'=>'Samsung'])->name('TVs');
这是控制器功能:
public function getTVs($type = null, $producer = null)
{
$products = DB::table('products')->paginate(16);
if($type!=null) {
$products = Product::where('type', $type)->paginate(16);
}
if($producer!=null) {
$products = Product::where('description','like', '%'.$producer.'%')->paginate(16);
}
return view('product.TVs', ['products' => $products]);
}
如果我选择类型,页面会刷新并显示结果。然后,如果我进入生产者,它再次起作用。如何以这样的方式制作路线,可选参数的顺序无关紧要,无论顺序如何,我都可以过滤结果?
答案 0 :(得分:0)
链接您的查询;现在,您正在运行3个查询,其中->paginate()
是一个闭包并触发数据库调用。试试这个:
$baseQuery = DB::table("products");
if($type){
$baseQuery->where("type", "=", $type);
}
if($producer){
$baseQuery->where("description", "like", "%".$producer."%");
}
$products = $baseQuery->paginate(16);
return view("products.TVs"->with(["products" => $products]);
正如您所看到的,我们会根据输入添加->where
子句,并且只在->paginate()
之前运行一个return
。这不是加性搜索,因此它是WHERE ... AND ...
而不是WHERE ... OR ...
;为此需要额外的逻辑。