我正在尝试创建自定义查询,以使用模型范围中的选择过滤数据,但是查询没有刷新,我只希望有一个参数,但是会收到以前的请求。
该范围在第一次提交表单并进行选择更改时起作用,我的查询就像article?category = 1一样,并且正确过滤了预期的数据。
但是如果我使用其他选择,例如用户,查询将变成商品?category = 1&user = 2,并且显然不会返回任何内容,因为查询是累积的。
这是我的模型文章中的范围:
public function scopeFilter($query, $filterBy)
{
if (isset($filterBy['category']))
{
$query->orWhere('category_id', $filterBy['category']);
}
if (isset($filterBy['specialite']))
{
$query->orWhere('specialite_id', $filterBy['specialite']);
}
if (isset($filterBy['user']))
{
$query->orWhere('user_id', $filterBy['user']);
}
return $query;
}
更新:如果用户建议,我尝试了其他方法,但是它不起作用
我在刀片视图中的表单:
<form method="GET" action="{{ route('articles.index') }}" class="col-12">
<h2>Filtrer par :</h2>
<div class="row">
<div class="col-md-3">
<select name="category" onchange="this.form.submit();">
<option {{ !Request::get('category') ? 'selected="selected"' : '' }} disabled>Catégorie</option>
@foreach($categories as $category)
<option value="{{ $category->id }}" {{ Request::get('category') == $category->id ? 'selected="selected"' : '' }}>{{ $category->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-3">
<select name="specialite" onchange="this.form.submit();">
<option {{ !Request::get('specialite') ? 'selected="selected"' : '' }} disabled>Spécialité</option>
@foreach($specialites as $specialite)
<option value="{{ $specialite->id }}" {{ Request::get('specialite') == $specialite->id ? 'selected="selected"' : '' }}>
{{ $specialite->name }}
</option>
@endforeach
</select>
</div>
<div class="col-md-3">
<select name="user" onchange="this.form.submit();">
<option {{ !Request::get('user') ? 'selected="selected"' : '' }} disabled>Auteur</option>
@foreach($users as $user)
<option value="{{ $user->id }}" {{ Request::get('user') == $user->id ? 'selected="selected"' : '' }}>
{{ $user->name }}
</option>
@endforeach
</select>
</div>
</div>
</form>
以及控制器中的索引方法:
public function index(Request $request)
{
$filterBy = $request->all();
$categories = Category::all();
$specialites = Specialite::all();
$users = User::all();
$articles = Article::filter($filterBy)->get();
return view('back.articles.index', compact('articles', 'categories', 'specialites', 'users'));
}
我尝试使用范围中的where而不是orWhere,它返回的数据是每次选择都经过过滤的,但是我希望仅通过一次选择来过滤并清除先前的查询。
任何帮助表示赞赏!