ahmed-aliraqi/laravel-filterable

Elegant query filtering for Laravel Eloquent models

v2.0.1 2025-06-24 06:55 UTC

This package is auto-updated.

Last update: 2025-06-24 06:55:42 UTC


README

A simple and elegant way to add filtering capabilities to your Laravel Eloquent models.

Latest Version on Packagist tests Total Downloads

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.