ahmed-aliraqi / laravel-filterable
Elegant query filtering for Laravel Eloquent models
v2.0.1
2025-06-24 06:55 UTC
Requires
- php: ^8.0
- illuminate/console: ^9.0|^10.0|^11.0|^12.0
- illuminate/database: ^9.0|^10.0|^11.0|^12.0
- illuminate/http: ^9.0|^10.0|^11.0|^12.0
- illuminate/support: ^9.0|^10.0|^11.0|^12.0
Requires (Dev)
- orchestra/testbench: ^7.0|^8.0|^9.0
- phpunit/phpunit: ^9.0|^10.0
README
A simple and elegant way to add filtering capabilities to your Laravel Eloquent models.
Installation
You can install the package via composer:
composer require ahmed-aliraqi/laravel-filterable
Usage
1. Create a Filter Class
Use the provided artisan command to create a new filter class:
php artisan make:filter UserFilter
This will create a new filter class in app/Http/Filters
:
namespace App\Http\Filters; use AhmedAliraqi\LaravelFilterable\BaseFilter; class UserFilter extends BaseFilter { protected array $filters = [ 'name', 'email', 'age' ]; public function name($value) { $this->builder->where('name', 'like', "$value%"); } public function email($value) { $this->builder->where('email', $value); } public function age($value) { $this->builder->where('age', $value); } }
2. Apply the Trait to Your Model
Add the Filterable
trait to your model:
use AhmedAliraqi\LaravelFilterable\Filterable; class User extends Model { use Filterable; // Optionally specify the filter class protected $filter = UserFilter::class; }
3. Use the Filter
You can now filter your model queries:
// In your controller use App\Http\Filters\UserFilter; public function index(Request $request) { $users = User::filter(new UserFilter($request->query()))->get(); return response()->json($users); }
Or if you've specified the filter class in your model:
$users = User::filter()->get();
Query Parameters
Your API endpoints will now automatically respond to query parameters that match your defined filters:
/api/users?name=John&age=25
Advanced Usage
Custom Namespaces
You can create filters in custom namespaces:
php artisan make:filter Filters/CustomFilter
Complex Filters
You can define complex filter methods:
class UserFilter extends BaseFilter { protected array $filters = [ 'age_range', 'created_between' ]; public function ageRange($value) { [$min, $max] = explode(',', $value); $this->builder->whereBetween('age', [$min, $max]); } public function createdBetween($value) { [$start, $end] = explode(',', $value); $this->builder->whereBetween('created_at', [$start, $end]); } }
Filter Arrays
You can handle array inputs in your filters:
class UserFilter extends BaseFilter { protected array $filters = ['status']; public function status(array $value) { $this->builder->whereIn('status', $value); } }
Testing
composer test
Authors
License
The MIT License (MIT). Please see License File for more information.