Easily apply search criteria on Laravel 5 queries
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
config
src
LICENSE
README.md
composer.json

README.md

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

  • Composer installable
  • PSR4 auto loading
  • Filter query in Laravel 5

Requires

Build only for Laravel Framework 5 only!

Installation

In terminal

composer require aginev/search-filters:1.0.*

Add Service Provider to your config/app.php like so

// config/app.php

'providers' => [
    '...',
    Aginev\SearchFilters\SearchFiltersServiceProvider::class
];

Publish config

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

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&f[last_name]=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

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 <= filter_value
     ->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

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

License

MIT - http://opensource.org/licenses/MIT

About

Need a freelance web developer? Contact me at my website http://aginev.com