Php 在Laravel中具有多个可选参数的搬运路线

Php 在Laravel中具有多个可选参数的搬运路线,php,sql,laravel,laravel-5,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, $produc

我正在尝试为一些产品实现一种过滤方法

这是路线:

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

如果选择类型,页面将刷新并显示结果。然后,如果我进入制作人,它再次工作。我如何才能以这样的方式进行路由,使可选参数的顺序无关紧要,并且无论顺序如何,我都可以过滤结果?

链接您的查询;现在,您正在运行3个查询,->paginate是一个闭包并触发一个DB调用。试试这个:

$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子句,并且只在返回之前运行一个->分页。这不是加法搜索,所以它是。。。和而不是在哪里。。。或这需要额外的逻辑。

非常感谢您的回答,现在搜索肯定有所改进。但是你知道我该怎么走这条路吗?现在,对于TVs/ledTV/Samsung,它工作得很好,但是如果用户首先选择producerSamsung,url将类似于TVs/Samsung/ledTV,该怎么办?我怎样才能创建路线,这样可选参数的顺序就不重要了?啊,我明白了,你把它们颠倒过来了。您最好使用带有查询字符串的GET请求来处理此问题,如http://TVs?type=ledTV&producer=Samsung,因为查询字符串不关心顺序。另一方面,URL参数对应于它们在函数声明中输入的顺序,因此$type总是第一位,$producer总是第二位。