【问题标题】:Handling route with multiple optional parameters in Laravel在 Laravel 中处理具有多个可选参数的路由
【发布时间】:2018-08-24 15:49:43
【问题描述】:

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

这是路线:

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

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

【问题讨论】:

    标签: php sql laravel laravel-5


    【解决方案1】:

    链接您的查询;现在,您正在运行 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 子句,并且仅在return 之前运行单个->paginate()。这不是加法搜索,所以它是WHERE ... AND ... 而不是WHERE ... OR ...;这需要额外的逻辑。

    【讨论】:

    • 非常感谢您的回答,现在搜索肯定有所改进。但是你知道我应该为这条路线做什么吗?现在,对于 TVs/ledTV/Samsung,它运行良好,但如果用户首先选择生产者(Samsung)并且 url 将类似于 TVs/Samsung/ledTV 怎么办?如何创建路由,使可选参数的顺序无关紧要?
    • 啊,我明白了,你把它们弄反了。您最好使用带有查询字符串的GET 请求来处理此问题,例如http://TVs?type=ledTV&producer=Samsung,因为查询字符串不关心顺序。另一方面,URL 参数对应于它们在函数声明中的输入顺序,因此$type 始终是第一,$producer 始终是第二。
    猜你喜欢
    • 2014-05-04
    • 2017-09-30
    • 2016-10-12
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    相关资源
    最近更新 更多