PHPackages                             aginev/search-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. aginev/search-filters

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

aginev/search-filters
=====================

Easily apply search criteria on Laravel 5+ queries

1.0.1(5y ago)307.5k↓50%5[3 PRs](https://github.com/aginev/search-filters/pulls)MITPHPPHP ^7.2|^8.0

Since Feb 7Pushed 3y ago1 watchersCompare

[ Source](https://github.com/aginev/search-filters)[ Packagist](https://packagist.org/packages/aginev/search-filters)[ Docs](http://aginev.com)[ RSS](/packages/aginev-search-filters/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (1)Versions (14)Used By (0)

Easily apply search criteria on Laravel 5 queries
=================================================

[](#easily-apply-search-criteria-on-laravel-5-queries)

This package will try to solve the problem with filtering a result set and will apply all the necessary checks for you.

Features
--------

[](#features)

- Composer installable
- PSR4 auto loading
- Filter query in Laravel 5+

Requires
--------

[](#requires)

Build to be used with Laravel only!

Installation
------------

[](#installation)

In terminal

```
composer require aginev/search-filters:2.0.*
```

Publish config

```
php artisan vendor:publish --provider="Aginev\SearchFilters\SearchFiltersServiceProvider" --tag="config"
```

Usage
-----

[](#usage)

Add Filterable trait to you models like so

```
use Aginev\SearchFilters\Filterable;
```

Implement setFilters method and define your filters. All filter methods are accepting a database column name as parameter.

```
/**
 * Set query filters
 *
 * Overwrite this method in the model to set query filters
 */
public function setFilters()
{
    $this->filter->equal('id', function ($by, $dir, $query) {
            // Every filter can recieve as last paramenter a closure that can be used for custom query order if required
            $query->orderBy($by, $dir);
        })
        ->like('email')
        ->like('first_name')
        ->like('middle_name')
        ->like('last_name')
        ->like('phone')
        ->equal('is_active')
        ->date('created_at')
        ->date('updated_at');
}
```

Need a custom filter?

```
public function setFilters()
{
    $this->filter->equal('id')
        ->custom('full_name', function ($query, $key, $value) {
            $query->where(\DB::raw("CONCAT_WS(' ', first_name, middle_name, last_name)"), 'LIKE', '%' . $value . '%');
        }, function ($by, $dir, $query) {
            // Define custom order or skip this parameter in method call
            $query->orderBy($by, $dir);
        });
}
```

Note that you need to pass the input filters to filter scope. My URLs typically looks like this [http://ex.com/?f\[first\_name\]=Atanas&amp;f\[last\_name\]=GinevRetrieve](http://ex.com/?f%5Bfirst_name%5D=Atanas&f%5Blast_name%5D=GinevRetrieve) Than you can get the results like so:

```
// Simple filter query
$users = User::filter(\Request::input('f', []))->get();

// Add additional where and pagination
$users = User::where('is_admin', '=', 1)
    ->filter(\Request::input('f', []))
    ->paginate(25);
```

Available filter methods
------------------------

[](#available-filter-methods)

```
public function setFilters()
{
     $this->filter
     ->custom('column', function($query, $column, $value) {
        // $query - instance of Illuminate\Database\Eloquent\Builder
        // $column - the string passed as first argument
        // $value - the filter value if exists and not empty
     }, function ($by, $dir, $query) {
        // Not required and can be applied to any other filter method

        // $by - order by field
        // $dir - order direction
        // $query - instance of Illuminate\Database\Eloquent\Builder
    })
     ->equal('column')                  // column = filter_value
     ->distinct('column')               // column  filter_value
     ->greaterThan('column')            // column > filter_value
     ->greaterOrEqualThan('column')     // column >= filter_value
     ->lessThan('column')               // column < filter_value
     ->lessOrEqualThan('column')        // column like('column')                   // column LIKE '%filter_value%'
     ->llike('column')                  // column LIKE '%filter_value'
     ->rlike('column')                  // column LIKE 'filter_value%'
     ->between('column')                // column BETWEEN filter_value[0] AND filter_value[1]
     ->notBetween('column')             // column NOT BETWEEN filter_value[0] AND filter_value[1]
     ->in('column')                     // column IN (filter_value[0], ..., filter_value[N])
     ->notIn('column')                  // column NOT IN (filter_value[0], ..., filter_value[N])
     ->null('column')                   // column IS NULL
     ->notNull('column')                // column IS NOT NULL
     ->date('column')                   // column DATE(column) = filter_value
     ->dateBetween('column');           // column DATE(column) BETWEEN filter_value[0] AND filter_value[1]
}
```

Contribution
------------

[](#contribution)

Want to share your custom filter methods? Submit a pull request, and I'll consider them :)

License
-------

[](#license)

MIT -

About
-----

[](#about)

Need a freelance web developer? Contact me at my website

###  Health Score

40

—

FairBetter than 88% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity34

Limited adoption so far

Community12

Small or concentrated contributor base

Maturity75

Established project with proven stability

 Bus Factor1

Top contributor holds 96.4% of commits — single point of failure

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 ~203 days

Recently: every ~434 days

Total

10

Last Release

1924d ago

Major Versions

v0.0.8 → 1.0.02020-09-17

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/8341783?v=4)[Atanas Ginev](/maintainers/aginev)[@aginev](https://github.com/aginev)

---

Top Contributors

[![aginev](https://avatars.githubusercontent.com/u/8341783?v=4)](https://github.com/aginev "aginev (27 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (1 commits)")

---

Tags

search filterssearch criteria on Laravel queriesLaravel search filters

### Embed Badge

![Health badge](/badges/aginev-search-filters/health.svg)

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

###  Alternatives

[pos-lifestyle/laravel-nova-date-range-filter

A Laravel Nova date range filter.

16179.1k](/packages/pos-lifestyle-laravel-nova-date-range-filter)[omure/scout-advanced-meilisearch

Laravel Scout extension that allows to use meilisearch advanced features as well as has an extended collection driver for testing purposes.

123.9k](/packages/omure-scout-advanced-meilisearch)

PHPackages © 2026

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