Как я могу сделать фильтр laravel, который принимает два входа или только один - PullRequest
1 голос
/ 29 апреля 2020

Итак, у меня есть база данных со студентами, и у меня есть имена, имена групп студентов и тому подобное, я хочу создать систему фильтров с несколькими фильтрами, например, я хочу отобразить строку (таблицы ) со студентами по имени Джон и находятся в группе A (должны выполняться оба условия). Но проблема в том, что когда мне нужен фильтр только для студентов, например, мне не нужна определенная группа, мой сценарий не работает, только для двух фильтров, а не только для одного.

Я пробовал это:

в маршруте: Route::post('/search', 'HomeController@search')->name('search'); в HomeController:

public function search(Request $request)
{
     $students = Student::query();
     $datas = $request->all();


    if ($request->has('group')) {
        $students = $students->where('group', $request->group);
    }

    if ($request->has('name')) {
        $students = $students->where('name', $request->name);
    }

    $students = $students->paginate(40);
    $data = array (
        'students' => $students,
        'datas' => $datas,
    );
    return view('searchStudent')->with($data);
}

А в блейде два простых ввода, кнопка и таблица со студентами.

<div class="col-sm-4">
   <div class="search-box grey lighten-3">
      <h2>Search Students</h2>
      <div class="input-r">
         <form action="{{ route('search') }}" method="post">
            @csrf
            <input name="name" type="text" class="form-control">
            <input name="group" type="text" class="form-control">
            <button class="btn btn-info btn-block" type="submit">Search</button>
         </form>
      </div>
   </div>
</div>
<div class="col-sm-8">
   @foreach ($students as $student)
   <div class="row pb-5">
      <div class="col-md-4">
         <div class="profiel-img">
            <img src="{{ asset($student->image) }}" alt="thumbnail" class="img-thumbnail" style="width: 200px">
         </div>
         <a class="btn btn-primary btn-sm" style="font-size: 12px; margin-left: 40px;" href="{{ route('student.show', $student) }}">Visit Profile</a>
      </div>
      <div class="col-md-8 pb-3">
         <h3 class="black-text"> {{ $student->name }}</h3>
         <h3 class="black-text"> {{ $student->group }}</h3>
         <hr style="border-top:1px solid #ccc;">
      </div>
   </div>
   @endforeach
   {{ $students->appends($datas)->links() }}
</div>

Мне нужно работать только для ввода имени и фильтра, только для группы и для обоих входов. С этим кодом он работает только для обоих (я не могу фильтровать только имя, только группу и т. Д. c.)

Ответы [ 2 ]

4 голосов
/ 29 апреля 2020

Я полагаю, $request->has() определяет, присутствует ли значение в запросе. Так что они всегда верны, так как ваши входные данные присутствуют в форме, и $students будет запрашиваться в пустых строках. Попробуйте использовать $request->filled() вместо.

if ($request->filled('group')) {
    $students = $students->where('group', $request->group);
}

if ($request->filled('name')) {
    $students = $students->where('name', $request->name);
}

Это для Laravel 7.x

1 голос
/ 29 апреля 2020

попробуйте добавить

    if ($request->has('group')) {
        $students = $students->orWhere('group', $request->group);
    }

    if ($request->has('name')) {
        $students = $students->orWhere('name', $request->name);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...