Learn how to implement advanced data filtering in Laravel 11 using query scopes, request parameters, and dynamic filtering techniques. This guide covers building flexible filters for models to enhance your application's search functionality.

File: resources/views/user.blade.php
<!-- FIlter -->
<div class="card rounded-0 p-3 mb-3">
<form id="filter-form" action="{{ route('user') }}" method="GET">
<div class="row g-3">
<div class="col-md-4">
<input class="form-control" type="text" name="search" placeholder="Search.." value="{{ request('search') }}">
</div>
<div class="col-md-3">
<input class="form-control" type="date" name="start_date" value="{{ request('start_date') }}">
</div>
<div class="col-md-3">
<input class="form-control" type="date" name="end_date" value="{{ request('end_date') }}">
</div>
<div class="col-md-2 text-center">
<input class="btn btn-outline-primary" type="submit" value="Filter">
<button type="button" class="btn btn-outline-danger" id="clearFilter">Clear</button>
</div>
</div>
</form>
</div>
File: resources/views/user.blade.php
"This is a JavaScript file. Include this code in the user.blade.php
file."
<script>
//================ clear filter button ===================
document.getElementById('clearFilter').addEventListener('click', () => {
window.location.href = {!! json_encode(route('user')) !!}
})
// JavaScript to handle form submission
document.getElementById('filter-form').addEventListener('submit', function(event) {
event.preventDefault();
// Collect form data
const form = event.target;
const formData = new FormData(form);
const queryParams = [];
formData.forEach((value, key) => {
if (value.trim() !== '') {
queryParams.push(`${key}=${encodeURIComponent(value)}`);
}
});
// Construct URL with query parameters
const actionUrl = form.getAttribute('action');
const urlWithParams = actionUrl + '?' + queryParams.join('&');
// Redirect to the constructed URL
window.location.href = urlWithParams;
});
</script>
File: app/Http/Controllers/UserController.php
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
public function index(Request $request)
{
$query = User::where('role', 'User');
// Apply filters
if ($request->filled('search')) {
$query->where(function ($q) use ($request) {
$q->where('users.name', 'like', '%' . $request->search . '%')
->orWhere('users.email', 'like', '%' . $request->search . '%')
->orWhere('users.phone', 'like', '%' . $request->search . '%');
});
}
// filter by date
if ($request->filled('start_date') && $request->filled('end_date')) {
$query->whereBetween('users.created_at', [
$request->start_date . ' 00:00:00',
$request->end_date . ' 23:59:59'
]);
} elseif ($request->filled('start_date')) {
$query->whereDate('users.created_at', '>=', $request->start_date);
} elseif ($request->filled('end_date')) {
$query->whereDate('users.created_at', '<=', $request->end_date);
}
$data['users'] = $query->latest('users.created_at')->paginate();
return view("user", $data);
}
}