Делал фильтр с помощью spatie/laravel-query-builder.
Сделал форму в Blade шаблоне для отображения фильтра.
<form method="GET" action="{{ route('post.index') }}" class="mb-6 flex gap-3">
<input type="text" name="filter[title]" placeholder="Search title..."
value="{{ request('filter.title') }}"
class="border rounded px-3 py-1">
<select name="filter[category_id]" class="border rounded px-3 py-1">
<option value="">All categories</option>
@foreach($categories as $category)
<option value="{{ $category->id }}"
@selected(request('filter.category_id') == $category->id)>
{{ $category->title }}
</option>
@endforeach
</select>
<button class="bg-indigo-600 text-white px-4 py-1 rounded">Filter</button>
</form>
Когда отправляю форму, получаю такой URL:
http://domain.com/posts?filter%5Btitle%5D=ab&filter%5Bcategory_id%5D=1
Как GET параметры подставились в URL?
У полей в форме есть атрибут name с квадратными скобками filter[title], filter[category_id].
Когда нажимаем кнопку Filter, браузер берёт name и value всех <input> и <select> и превращает их в GET-параметры. Это дефолтное поведение. Так происходит всегда, когда метод формы = GET.
<input type="text" name="filter[title]" placeholder="Search title..."
value="{{ request('filter.title') }}"
class="border rounded px-3 py-1">
<select name="filter[category_id]" class="border rounded px-3 py-1">
<option value="">All categories</option>
@foreach($categories as $category)
<option value="{{ $category->id }}"
@selected(request('filter.category_id') == $category->id)>
{{ $category->title }}
</option>
@endforeach
</select>
Например, если ты вводишь:
title = ab
category_id = 2
то браузер отправит запрос на:
/posts?filter[title]=ab&filter[category_id]=2
Это поведение определено стандартом HTML и не зависит от Laravel, JavaScript и т.д.
— Оно происходит всегда, когда метод формы = GET.
Если мы поменяем нейминг полей в форме, например на “test-field”, то в URL подставится GET параметр “?test-field=…”.
<input type="text" name="test-field" placeholder="Search title..."
/// URL
http://laravel-course.test/posts?test-field=ab&filter%5Bcategory_id%5D=1
Что происходит при POST
Если ты поменяешь на:
<form method="POST" action="/posts">
то браузер не добавит параметры в URL, а отправит их в теле запроса (request body) в формате application/x-www-form-urlencoded.
Laravel при этом получит те же данные, просто они будут не в $_GET, а в $_POST.