追加带有多个过滤器的查询字符串

时间:2019-03-31 13:41:34

标签: arrays laravel laravel-5 query-string laravel-routing

我有一个过滤器栏,可一次搜索一个过滤器。但是,我想立即选择多个过滤器。我所有的过滤器链接目前都只有一个查询字符串。有没有一种方法可以将查询字符串附加到另一个查询中?

当前,我在类似以下代码的控制器中设置过滤器。

$products = new Product();
$queries = [];

$columns = [
    'beertype_id', 'packaging', 'brewery_id'
];

foreach ($columns as $column) {
    if (request()->has($column)) {
        $products = $products->where($column, request($column));
        $queries[$column] = request($column);
    }
}

$products = $products->paginate(10)->appends($queries);

然后我要在Blade模板中称呼它们。

<p>Filter Products:</p>
<a href="/products">Reset</a>
<ul>
    <p>Types of Beer:</p>
    <li class="filter-link"><a href="/products?beertype_id=1">IPA</a></li>
    <li class="filter-link"><a href="/products?beertype_id=2">Lager</a></li>
    <li class="filter-link"><a href="/products?beertype_id=3">Pale Ale</a></li>
</ul>
<ul>
    <p>Packaging:</p>
    <li class="filter-link"><a href="/products?packaging=bottle">Bottle</a></li>
    <li class="filter-link"><a href="/products?packaging=can">Can</a></li>
    <li class="filter-link"><a href="/products?packaging=keg">Keg</a></li>
</ul>
<ul>
    <p>Brewery:</p>
    <li class="filter-link"><a href="/products?brewery_id=2">Kinnegar</a></li>
    <li class="filter-link"><a href="/products?brewery_id=3">White Hag</a></li>
    <li class="filter-link"><a href="/products?brewery_id=4">Quilmes</a></li>
</ul>

我想要一个查询字符串,例如 ?beertype_id=3&beertype_id=5&brewery_id=2。当用户单独单击过滤器时,如何每次都添加新过滤器?例如,如果用户单击“ IPA”,则将显示所有IPA产品,然后,如果用户单击“ Porter”,则将同时显示Porter和IPA产品。

1 个答案:

答案 0 :(得分:0)

您可以在查询中传递数组:

<p>Filter Products:</p>

<a href="/products">Reset</a>

<ul>
    <p>Types of Beer:</p>

    <li class="filter-link"><a href="/products?beertype_id[]=1&beertype_id[]=4" >IPA</a></li>
    <li class="filter-link"><a href="/products?beertype_id[]=2&beertype_id[]=5">Lager</a></li>
    <li class="filter-link"><a href="/products?beertype_id[]=3&beertype_id[]=6">Pale Ale</a></li>
</ul>

并像这样在控制器中获取此数组

$products = new Product;


$queries = [];

$columns = [
    'beertype_id', 'packaging', 'brewery_id'
];

foreach ($columns as $column){
    if (request()->has($column)){
      if(is_array(request($column))){
        $products = $products->whereIn($column, request($column));
      } else {
        $products = $products->where($column, request($column));
      }

      $queries[$column] = request($column);
    }


}

$products = $products->paginate(10)->appends($queries);