A simple and elegant way to map request queries to database queries in Laravel, following single responsibility principles.
composer require curvestech/laravel-request-filters
The service provider will be automatically registered via Laravel's package auto-discovery.
php artisan make:filter UserFilter
This creates a filter class in app/Http/Filters/UserFilter.php
.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Curvestech\LaravelRequestFilters\Traits\Filterable;
class User extends Model
{
use Filterable;
}
<?php
namespace App\Http\Controllers;
use App\Http\Filters\UserFilter;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index(UserFilter $filter)
{
$users = User::filter($filter)->get();
return response()->json($users);
}
}
Each public method in your filter class corresponds to a query parameter:
<?php
namespace App\Http\Filters;
use Curvestech\LaravelRequestFilters\AbstractFilter;
use Illuminate\Database\Eloquent\Builder;
class UserFilter extends AbstractFilter
{
// URL: ?name=john
public function name(Builder $builder, $value): Builder
{
return $builder->where('name', 'like', '%' . $value . '%');
}
// URL: ?status=active
public function status(Builder $builder, $value): Builder
{
return $builder->where('status', $value);
}
// URL: ?created_from=2023-01-01
public function createdFrom(Builder $builder, $value): Builder
{
return $builder->where('created_at', '>=', $value);
}
}
GET /users?name=john&status=active
GET /users?created_from=2023-01-01&created_to=2023-12-31
GET /users?ids=1,2,3
# or
GET /users?ids[]=1&ids[]=2&ids[]=3
- PHP ^8.0
- Laravel ^8.0|^9.0|^10.0|^11.0|^12.0
MIT