Laravel-从选择范围过滤查询

时间:2019-08-14 11:48:06

标签: laravel select filter scopes

我正在尝试创建自定义查询,以使用模型范围中的选择过滤数据,但是查询没有刷新,我只希望有一个参数,但是会收到以前的请求。

该范围在第一次提交表单并进行选择更改时起作用,我的查询就像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,它返回的数据是每次选择都经过过滤的,但是我希望仅通过一次选择来过滤并清除先前的查询。

任何帮助表示赞赏!

0 个答案:

没有答案