Автофильтр без использования кнопки и ajax в Laravel - PullRequest
0 голосов
/ 18 мая 2019

У меня есть 3 таблицы:

Type: id, name
Level: id, name
Question: id, content, type_id, level_id

Я сделал функцию фильтра с помощью кнопки «Фильтр».Но теперь я хочу, чтобы при фильтрации данные автоматически загружались в таблицу без использования кнопки.Как я могу это сделать?

Вот мой код с помощью кнопки

FilterController:

public function filter(Request $request){
        $types = Type::all();
        $levels = Level::all();
        $model = Question::where('id', '>', 0);

        if (isset($request->type))
            $model = $model->where('type_id', $request->type);
        if (isset($request->level))
            $model = $model->where('level_id', $request->level);

        $data = $model->paginate(999)->appends(request()->query());

        return view('filter', compact( 'data', 'request', 'types','levels'));
    }

filter.blade.php

<form method="get">
    <select name="type">
        <option value="">All Types</option>
        @foreach ($types as $item)
            <option value="{{ $item->id }}" @if ($request->type == $item->id) selected @endif>{{ $item->name }}</option>
        @endforeach
    </select>
    <select name="level">
        <option value="">All Levels</option>
        @foreach ($levels as $item)
            <option value="{{ $item->id }}" @if ($request->level == $item->id) selected @endif>{{ $item->name }}</option>
        @endforeach
    </select>
    <button type="submit" class="btn btn-primary">Filter</button>
</form>
<table border="1">
    <tr>
        <th>ID</th>
        <th>Content</th>
    </tr>
    @foreach ($data as $q)
        <tr>
            <td>{{ $q->id }}</td>
            <td>{{ $q->content }}</td>
        </tr>
    @endforeach
</table>

1 Ответ

1 голос
/ 18 мая 2019

Вы можете просто отправить форму, когда ваши выбранные значения изменятся:

<select onchange="this.form.submit()">
    ...
</select>

Или, если вы не хотите использовать форму, предполагая, что ваш путь равен /questions, и вы установили свойство APP_URL в своем файле .env, вы можете сделать что-то похожее на следующее:

<select name="type" onchange="window.location.href = this.value">
    <option value="{{ url('questions') }}">All types</option>
    @foreach($types as $type)
        <option value="{{ url('questions') }}?type={{ $type->id }}"{{ request('type') == $type->id ? ' selected' : '' }}>
            {{ $type->name }}
        </option>
    @endforeach
</select>

Если вы хотите, чтобы текущий выбранный уровень оставался выбранным при фильтрации по типу, вы можете изменить значение параметра на следующее:

<option value="{{ url('questions') . '?' . (request()->filled('level') ? 'level=' . request('level') . '&' : '') . 'type=' . request('type') }}">
    {{ $type->name }}
</option>

Ответ на мой телефон, так что может быть нарушен синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...