PHPackages                             laravelway/query-filters - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Search &amp; Filtering](/categories/search)
4. /
5. laravelway/query-filters

ActiveLibrary[Search &amp; Filtering](/categories/search)

laravelway/query-filters
========================

Laravel package for filtering models via query string

1.0.1(1y ago)01[4 PRs](https://github.com/laravelway/query-filters/pulls)MITPHPPHP ^8.3CI passing

Since Jan 4Pushed 2mo ago1 watchersCompare

[ Source](https://github.com/laravelway/query-filters)[ Packagist](https://packagist.org/packages/laravelway/query-filters)[ Docs](https://github.com/laravelway/query-filters)[ GitHub Sponsors]()[ RSS](/packages/laravelway-query-filters/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (2)Dependencies (15)Versions (8)Used By (0)

Readme
======

[](#readme)

This package can be used for filtering eloquent using query string.

```
// URL example: https://example.com?name=John&email=gmail.com

```

First you have to use `QueryFilters` trait in your model.

```
use LaravelWay\QueryFilters\Traits\QueryFilters;

class User extends Model
{
     use QueryFilters;
}
```

Then you can use `addQueryFilters` scope on your model to add any filters you want.

1. Using array of filters

```
use LaravelWay\QueryFilters\Filters\EqualFilter;
use LaravelWay\QueryFilters\Filters\ContainsFilter;

User::query()
    ->addQueryFilters(filters: [
        'name' => EqualFilter::class,
        'email' => ContainsFilter::class
    ]);
```

In this case it will filter by name parameter and email parameter from query string.

2. You can call `addQueryFilters` multiple times. It will merge all filters together.

```
use LaravelWay\QueryFilters\Filters\EqualFilter;
use LaravelWay\QueryFilters\Filters\ContainsFilter;

User::query()
    ->addQueryFilters(filters: [
        'name' => EqualFilter::class,
    ])
    ->addQueryFilters(filters: [
        'email' => ContainsFilter::class,
    ]);
```

3. You can use callbacks as filters.

```
User::query()
    ->addQueryFilters(filters: [
        'name' => function (Builder $builder, string $key, mixed $value, mixed $params = null) {
            $builder->where($key, $value);
        },
    ]);
```

4. You can use filters classes to define all filters there. In that case class must be extended from `FiltersAbstract` class.

```
use LaravelWay\QueryFilters\Filters\EqualFilter;
use LaravelWay\QueryFilters\Filters\ContainsFilter;

class UserFilters extends FiltersAbstract
{

    /** @var array */
    public array $filters = [
        'name' => EqualFilter::class,
        'email' => ContainsFilter::class,
    ];

    /**
     * @param  Builder  $builder
     */
    public function filterSearch(Builder $builder, string $key, mixed $value, mixed $params = null): void {
        $builder->whereLike('name', "%$value%")->whereLike('email', "%$value%");
    }
}

// and then you can use this class for filtering
User::query()->addQueryFilters(filters: UserFilters::class);
```

As you can see, you can define standard filters in `$filters` property as array, or you can define custom functions which are prefixed with `filter` word. In our case `filterSearch` is using as filtering function, it means that it will filter by query parameter `search`.

There are some standard filtering classes you can use for filtering.

### EqualFilter

[](#equalfilter)

it filters for exact value.

```
public array $filters = [
    'name' => EqualFilter::class,
];

// ?name=John - it will search all rows which are equals to John.
// it can be case-insensitive if table column's collation ends with _ci suffix.
```

### ContainsFilter

[](#containsfilter)

It filters rows which are contains that value in any part of string.

```
public array $filters = [
    'name' => ContainsFilter::class,
];

// ?name=John - it will search all rows which are contains John string.
// it can be case-insensitive if table column's collation ends with _ci suffix.
```

### ContainsInFilter

[](#containsinfilter)

This filter can be used if we need to filter for value can be found on multiple columns. Usually it used then user types something in one search input, but we must filter rows where that value can be found on one of the following columns.

```
public array $filters = [
    'search' => [ContainsInFilter::class, ['name', 'email', 'role']],
];

// ?search=John - it will search all rows which are contains John string in name, email or role columns.
// it can be case-insensitive if table column's collation ends with _ci suffix.
```

### LikeFilter

[](#likefilter)

This filter is similar to ContainsFilter, but contains will find in any part of string, but with like filter, you can specify in query string via \* which part of string sould contain a value.

```
public array $filters = [
    'name' => LikeFilter::class,
];

// ?name=John* - it will search all rows which are starting with John
// ?name=*John - it will search all rows which are ending with John
// it can be case-insensitive if table column's collation ends with _ci suffix.
```

### TrashedFilter

[](#trashedfilter)

This filter is using to filter deleted rows if model uses SoftDeletes trait.

```
public array $filters = [
    'trashed' => TrashedFilter::class,
];

// ?trashed=with - it will search all rows even soft deleted rows
// ?trashed=only - it will search only soft deleted rows
```

### DateFilter

[](#datefilter)

This filter is using for filter dates.

```
public array $filters = [
    'trashed' => TrashedFilter::class,
];

// ?created_at=2024-03-01 - it will filter all rows which are created exactly at selected date
// ?created_at=2024-03-01, - it will filter all rows where created_at field more or equal to selected date
// ?created_at=,2024-03-01 - it will filter all rows where created_at field less or equal to selected date
// ?created_at=2024-03-01,2024-03-16 - it will filter all rows where created_at field is between two selected dates including both dates
```

---

TODO
----

[](#todo)

- test sorting
- filter relations
- sort relations
- include relations into response

###  Health Score

35

—

LowBetter than 77% of packages

Maintenance65

Regular maintenance activity

Popularity1

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

544d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/85644385?v=4)[amanukian](/maintainers/amanukian)[@amanukian](https://github.com/amanukian)

---

Top Contributors

[![alikmanukian](https://avatars.githubusercontent.com/u/4147821?v=4)](https://github.com/alikmanukian "alikmanukian (6 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (5 commits)")[![github-actions[bot]](https://avatars.githubusercontent.com/in/15368?v=4)](https://github.com/github-actions[bot] "github-actions[bot] (5 commits)")

---

Tags

laravelquery-filterslaravelway

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/laravelway-query-filters/health.svg)

```
[![Health](https://phpackages.com/badges/laravelway-query-filters/health.svg)](https://phpackages.com/packages/laravelway-query-filters)
```

###  Alternatives

[spatie/laravel-permission

Permission handling for Laravel 12 and up

12.9k102.4M1.4k](/packages/spatie-laravel-permission)[spatie/laravel-pdf

Create PDFs in Laravel apps

1.0k4.8M46](/packages/spatie-laravel-pdf)[dedoc/scramble

Automatic generation of API documentation for Laravel applications.

2.1k11.2M97](/packages/dedoc-scramble)[spatie/laravel-passkeys

Use passkeys in your Laravel app

471890.7k37](/packages/spatie-laravel-passkeys)[rawilk/profile-filament-plugin

Profile &amp; MFA starter kit for filament.

3914.6k](/packages/rawilk-profile-filament-plugin)[codewithdennis/filament-select-tree

The multi-level select field enables you to make single selections from a predefined list of options that are organized into multiple levels or depths.

329530.5k29](/packages/codewithdennis-filament-select-tree)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
