在Laravel中使用多个可选参数处理路径

时间:2018-03-15 17:52:21

标签: php sql laravel laravel-5

我正在尝试为某些产品实施过滤方法。

这是路线:

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]);
    }

如果我选择类型,页面会刷新并显示结果。然后,如果我进入生产者,它再次起作用。如何以这样的方式制作路线,可选参数的顺序无关紧要,无论顺序如何,我都可以过滤结果?

1 个答案:

答案 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 ...;为此需要额外的逻辑。