tijanidevit/query-filter

A simple, expressive, and powerful Laravel package that provides dynamic Eloquent models filters with clean syntax. It helps build reusable, maintainable, and readable query logic in Laravel apps.

v0.0.1 2025-05-05 00:04 UTC

This package is auto-updated.

Last update: 2025-06-05 06:06:58 UTC


README

A simple, expressive, and powerful Laravel package that provides dynamic Eloquent model filters with clean syntax. It helps you build reusable, maintainable, and readable query logic in Laravel applications.

Latest Version on Packagist Downloads License

📦 Why Use This Package?

In many Laravel applications, especially admin dashboards, reporting systems, and search filters, developers write the same filtering logic over and over:

    $query = User::query();

    if (request()->filled('name')) {
        $query->where('name', request('name'));
    }

    if (request()->filled('status')) {
        $query->where('status', request('status'));
    }

    return $query->get();

With Query Filter, you can simplify this:

    User::query()
        ->filterBy([
            'name' => request('name'),
            'status' => request('status'),
        ])
        ->get();

📦 Installation

Run the composer command below:

composer require tijanidevit/query-filter

The package supports auto-discovery. If you're using Laravel < 5.5, add the provider manually in your config/app.php:

'providers' => [
    Tijanidevit\QueryFilter\Providers\FilterProvider::class,
]

🔍 Available Filters

filterBy()

Filter by a column or multiple columns.

User::query()->filterBy('status', 'active')->get();


User::query()->filterBy([
    'name'   => 'Jane',
    'status' => ['active', 'pending'],
])->get();
  • Handles null, arrays, or empty values smartly.
  • Validates that the column exists in the database.

filterByRelation()

Filter using related models:

Post::query()->filterByRelation([
    'user' => [
        'status' => 'active',
    ]
])->get();

Supports closures and nullable logic.

filterByMonth() / filterByYear()

Order::query()
    ->filterByMonth([1, 2]) // January and February
    ->filterByYear(2024)
    ->get();

filterByDate()

User::query()->filterByDate('2024-01-01')->get();

filterByDateRange()

Order::query()->filterByDateRange('2024-01-01', '2024-03-01')->get();

filterFromRequest()

Automatically apply filters based on request input:

User::query()->filterFromRequest(request(), [
    'name', 'email', 'status'
])->get();

sortResultBy() / latestBy() / oldestBy()

User::query()->sortResultBy('created_at', 'desc')->get();

Post::query()->latestBy('published_at')->get();

📘 Full Example

$users = User::query()
    ->filterBy([
        'name' => request('name'),
        'status' => request('status'),
        'email_verified_at' => ['null' => request('missing_email_verification')],
    ])
    ->filterByRelation([
        'roles' => [
            'slug' => request('role_slug'),
        ],
    ])
    ->filterByDateRange(request('from'), request('to'))
    ->sortResultBy(request('sort_by'), request('sort_dir', 'asc'))
    ->get();

✅ Requirements

  • Laravel 9, 10, 11
  • PHP 8.0+

📄 License

MIT © Mustapha Tijani

🤝 Contributing

Pull requests and issues are welcome. Help improve the package and make it more awesome!