Задать вопрос

Как отфильтровать данные по нескольким запросам в Laravel?

Доброго дня всем
Стоит задача сделать фильтр, как на этой странице - https://postupi.kz/specialnosty/
Я сделал и все работает. Вот код:
Форма
<form action="{{ route('filtracia') }}" method="get">
    @foreach($vuz as $item)
        <p>
            <input type="checkbox" name="{{ $item->name }}" value="{{ $item->id }}">
            {{ $item->title }}
        </p>
    @endforeach
    <h5>Направление обучения</h5>
    <hr>
    @foreach($napravlenie as $value)
        <p>
            <input type="checkbox" name="{{ $value->alias }}" value="{{ $value->id }}">
            {{ $value->title }}
        </p>
    @endforeach
    <hr>
    <button class="btn btn-success" type="submit">Подобрать</button>
    </form>

Контроллер
if ($request->tehnical || $request->urist || $request->economic || $request->managmant || $request->gumanitar) {
            $data = Specialnosti::whereIn('univer_id', [
                $request->bntu,
                $request->tulgu,
                $request->mmu,
                $request->mip,
                $request->tgu,
                $request->vgu,
            ])->whereIn('napravlenie_id', [
                $request->tehnical,
                $request->urist,
                $request->economic,
                $request->managmant,
                $request->gumanitar,
            ])->get();

        } else {
            $data = Specialnosti::whereIn('univer_id', [
                $request->bntu,
                $request->tulgu,
                $request->mmu,
                $request->mip,
                $request->tgu,
                $request->vgu,
            ])->get();
        }

        if (!$request->bntu && !$request->tulgu && !$request->mmu && !$request->mip && !$request->tgu && !$request->vgu) {
            $data = Specialnosti::whereIn('napravlenie_id', [
                $request->tehnical,
                $request->urist,
                $request->economic,
                $request->managmant,
                $request->gumanitar,
            ])->get();
        }

Но это работает только со статическими данными. Т.е., если добавить ВУЗ или специальность, то придется вручную добавлять код в контроллере. Как правильно организовать фильтрацию (запрос к БД), чтобы работало без правки контроллера?

Большое спасибо за любую помощь.
  • Вопрос задан
  • 287 просмотров
Подписаться 2 Простой 4 комментария
Решения вопроса 1
@vism
<input type="checkbox" name="vuz[{{ $item->name }}]" value="{{ $item->id }}">
<input type="checkbox" name="napravlenie[{{ $value->alias }}]" value="{{ $value->id }}">


от этого и пляшите. Прям вот код писать за вас мне лень.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
alexey_bille
@alexey_bille
Web developer
Нужно name поставить что то вроде name="univer[]" , тогда в $request->univer будет массив выбранных checkbox'ов

Что то похожее на stackoverflow
Ответ написан
Комментировать
@jazzus
Можно пройтись форычем по реквест ол и собрать в билдер нужный запрос. Типа
foreach ($request->all() as $name => $value)
        {
          // Если название метода совпадает с названием параметра из реквеста
          if (method_exists($this, $name))
          {
            //Запускаем методы
            $this->$name($value);
          }
        }
        //В конце возвращаем собранный билдер для дальнейшего использования
        return $this->builder;

ну и методы фильтров сделать типа
public function name($value)
  {
     $this->builder->where('name', 'like', "%$value%");
  }

это, конечно если я правильно понял что нужно. В общем в качестве идеи) Но перечислять весь реквест, конечно не нужно, замучаешься рефакторить. Плюс нельзя к реквесту обращаться вот так $request->tehnical Только через инпут или гет Эх новички новички..))

Если только с моделью, контроллером без отдельного класса - то еще вариант :
Делаете в модели Specialnosti скопы (названия должны начинаться со scope)
public function scopeOfUniverById($query, $request)
    {
      foreach ($request->all() as $id)
          {
              $builder = $query->where('univer_id', $id);
          }
        return $builder;
    }

и в контроллере
$spec = Specialnosti::ofUniverById($request)->get();

я не тестировал, но по идее должно работать)
Ответ написан
SkazochNick
@SkazochNick Автор вопроса
Проблему решил. Все оказалось довольно просто, спасибо vism за подсказку. Во вьюхе изменил имена
<input type="checkbox" name="vuz[{{ $item->name }}]" value="{{ $item->id }}">
<input type="checkbox" name="napr[{{ $value->alias }}]" value="{{ $value->id }}">

А в контроллере написал
$vuz_array = $request->vuz;
        $napr_array = $request->napr;
        
        if ($napr_array) {
            $data = Specialnosti::whereIn('napravlenie', $napr_array)->get();
        }
        if ($vuz_array) {
            $data = Specialnosti::whereIn('univer_alias', $vuz_array)->get();
        }
        
        if ($vuz_array && $napr_array) {
            $data = Specialnosti::whereIn('univer_alias', $vuz_array)->whereIn('napravlenie', $napr_array)->get();
        }

Работает отлично. Спасибо всем за помощь
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы