PHPackages                             davidoc26/eloquent-filter - 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. [Database &amp; ORM](/categories/database)
4. /
5. davidoc26/eloquent-filter

ActiveLibrary[Database &amp; ORM](/categories/database)

davidoc26/eloquent-filter
=========================

Simple filter system for building queries

v2.3.0(3y ago)561MITPHPPHP &gt;=8.0

Since Dec 29Pushed 3y ago2 watchersCompare

[ Source](https://github.com/Davidoc26/eloquent-filter)[ Packagist](https://packagist.org/packages/davidoc26/eloquent-filter)[ RSS](/packages/davidoc26-eloquent-filter/feed)WikiDiscussions main Synced 3w ago

READMEChangelog (9)Dependencies (6)Versions (10)Used By (0)

Eloquent Filters
================

[](#eloquent-filters)

Simple filter system for building queries

[![Latest Stable Version](https://camo.githubusercontent.com/74d3ffc60dfa3344a2d0b7bf2e2b8045b98e20fb5e8262c29a77b4898eb7ea2f/687474703a2f2f706f7365722e707567782e6f72672f64617669646f6332362f656c6f7175656e742d66696c7465722f76)](https://packagist.org/packages/davidoc26/eloquent-filter)[![Total Downloads](https://camo.githubusercontent.com/f30610a993b5d05e21b90e708bc7423a1ab175d2c94a9f883d66b6439f2b962f/687474703a2f2f706f7365722e707567782e6f72672f64617669646f6332362f656c6f7175656e742d66696c7465722f646f776e6c6f616473)](https://packagist.org/packages/davidoc26/eloquent-filter)[![License](https://camo.githubusercontent.com/daf20ec5961ed421c2e2990dc2ce4b03728b23915121bd134ca7c574d866bc93/687474703a2f2f706f7365722e707567782e6f72672f64617669646f6332362f656c6f7175656e742d66696c7465722f6c6963656e7365)](https://packagist.org/packages/davidoc26/eloquent-filter)[![PHP Version Require](https://camo.githubusercontent.com/eaf41ec85d571f940977ae534e54c8592a19c778d2886cb5f265a07eb799dd70/687474703a2f2f706f7365722e707567782e6f72672f64617669646f6332362f656c6f7175656e742d66696c7465722f726571756972652f706870)](https://packagist.org/packages/davidoc26/eloquent-filter)

Requirements
------------

[](#requirements)

- PHP 8.0+
- Laravel 8, 9, 10

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

[](#installation)

```
composer require davidoc26/eloquent-filter
```

Introduction
------------

[](#introduction)

Filters allow you to apply restrictions/rules to create a query. It's like middlewares.

There are two types of filters:

1. Filter
2. RequestFilter (gives you access to the Request instance)

Filters can also [have their own arguments (using HasArguments trait)](https://github.com/Davidoc26/eloquent-filter#filter-arguments)

Usage
-----

[](#usage)

### Using Filterable

[](#using-filterable)

To start using filters, you need to use **Filterable** trait on your model.

```
use Davidoc26\EloquentFilter\Traits\Filterable;

class Post extends Model
{
    use Filterable;
}
```

To define filters, override the **getFilters()** method in your model and return the filters. If no filters have been defined, no filtering will be performed.

```
public function getFilters(): array
{
    return [
        FirstFilter::class,
        SecondFilter::class => ['argument' => 20], // As mentioned above, filters can have their own arguments.
    ];
}
```

### Creating new filter

[](#creating-new-filter)

To create a basic filter use the command:

`php artisan make:filter MyFilter`

This command will create a filter inside app/Filters directory.

```
use Davidoc26\EloquentFilter\Filters\Filter;

class MyFilter extends Filter
{
    public function filter(Builder $builder, Closure $next): Builder
    {
        //

        return $next($builder);
    }
}
```

### Creating new RequestFilter

[](#creating-new-requestfilter)

If you need a filter that has a Request instance available, create a RequestFilter:

`php artisan make:request-filter MyRequestFilter`

```
use Davidoc26\EloquentFilter\Filters\RequestFilter;

class MyRequestFilter extends RequestFilter
{
    public function filter(Builder $builder, Closure $next): Builder
    {
        // $this->request

        return $next($builder);
    }
}
```

### Filter arguments

[](#filter-arguments)

If you want your filter to have arguments (for example default values) use the **HasArguments trait on your filter**.

To set the arguments, specify them in your model's **getFilters()** method:

```
public function getFilters(): array
{
    return [
        LimitFilter::class => ['limit' => 10], // For convenience, specify the arguments in an array.
    ];
}
```

Then, you can get your arguments in your filter using dynamic properties

```
use Davidoc26\EloquentFilter\Filters\RequestFilter;
use Davidoc26\EloquentFilter\Traits\HasArguments;

class LimitFilter extends RequestFilter
{
    use HasArguments;

    public function filter(Builder $builder, Closure $next): Builder
    {
        // If there is no limit in the request, we use the limit specified in the model.
        $builder->when(
            $this->request->input('limit', $this->limit),
            fn(Builder $builder, $limit) => $builder->limit($limit)
        );

        // Note that you must always return this.
        return $next($builder);
    }
}
```

To see all the arguments you have defined in the model, use the **getArguments()** filter method

Filter Packs
------------

[](#filter-packs)

Filter packs allows you to collect several filters in one pack. The main purpose of a filter pack is to apply the same filters to models.

To create a filter pack use command:

`php artisan make:filter-pack MyFilterPack`

It will create filter pack in app/Filters/Packs directory:

```
