jasco-b/query-filter

query filter for laravel

1.0.0 2019-09-18 10:34 UTC

This package is auto-updated.

Last update: 2024-05-14 18:53:28 UTC


README

Laravel query filter helps to filtering results on search. You don`t need to write if statement or eloquent builder method when in your search in order to filter your results.

Installation

You can install the package via composer:

composer require jasco-b/query-filter

Usage

You can write your filters in following ways:

  • Method
  • Stand alone class
  • Closure

Method

use JascoB\QueryFilter\QueryFilter;

class PostFilter extends QueryFilter
{
    protected $filterableFields = ['title'];

    public function title($query, $value)
    {
        $query->orWhere('title', 'like', '%' . $value . '%');
    }

}

Stand Alone Class

First of all we need to create a stand alone class which implements IFilterColumn or extends abstract class FilterColumn

use JascoB\QueryFilter\Classes\FilterColumn;

class TagFilterColumn extends FilterColumn
{
    public function apply($value)
    {
        return $this->builder->whereHas('tags', function ($query) use ($value) {
            $query->where('name', 'like', '%' . $value . '%');
        });
    }
}
use JascoB\QueryFilter\QueryFilter;

class PostFilter extends QueryFilter
{
    protected $filterableFields = ['title', 'tag'=>TagFilterColumn::class];
    
}

Closure

class PostFilter extends QueryFilter
{
    protected $filterableFields = [];

    public function __construct(Builder $builder)
    {
        parent::__construct($builder);
        $this->initFilters();
    }

    public function initFilters()
    {
        $this->filterableFields['title'] = function ($query, $value) {
            $query->where('title', 'like', "%$value%");
        };
    }
}

Model

In your model you must use it.

class Post extends Model
{
    public function scopeFilter($query, $request)
    {
        return (new PostFilter($query))->filter($request);
    }

Controller

In your controller, service or repository you can use it like this.

class SearchController extends Controller
{
    public function filter(Request $request)
    {
       $posts =  Post::query()->filter($request->toArray())->get();
    }
}

Tests

Running tests: composer test