mohamedgaber-intake40 / filter-quent
An easy way to filter Queries Laravel Eloquent.
v2.0.2
2022-11-27 14:45 UTC
This package is auto-updated.
Last update: 2024-12-27 19:07:25 UTC
README
An easy way to filter Queries Laravel Eloquent.
Install (Laravel)
$ composer require mohamedgaber-intake40/filter-quent
The Package is auto discovered , but you can register Service Provider in config/app.php
'providers' => [ \Filter\Providers\FilterServiceProvider::class ];
Usage
##Filter
- make filter class using this command for example UserFilter
php artisan make:filter UserFilter
- this will generate UserFilter in app\Filters
- add the Filter\Traits\HasFilter trait to your model(s):
class User extends Authenticatable { use HasFilter; }
- this will add filter scope to User model
- note : User model its filter class should be UserFilter by default , but you can override this by overriding getFilterClassName method in the model
protected function getFilterClassName() { return App\Filters\MyUserFilter::class; }
- in App\Filters\UserFilter Class , you have to add methods to filter model properties for example :
- if you want to filter name you have to add filter name method like this
protected function filterName($name) { $this->query->where('name','like',"%$name%"); }
- also, you can filter any relations , example : user has many posts
protected function filterPosts($posts) { $this->query->whereHas('posts',function($q) use ($posts){ $q->whereIn('id',$posts); }); }
- now you can filter your model query like this
App\Models\User::filter([ 'name' => 'test' , 'posts' => [1,2,3] ])->get();
Notes
- filter method must be filter{property} example to filter name , it will be filterName
- if property is something_something , method will be filterSomethingSomething , example : filterFirstName
- when filter class has many methods like filterName, filterAge these methods will be called only when filter array has property matched with the method name
##Sort
- add the Filter\Traits\HasSortable trait to your model(s):
class User extends Authenticatable { use HasSortable; }
- add sortable array to your model(s):
/** * The attributes that can be sorted. * * @var array<string> */ protected $sortable = [ 'id', 'name', 'created_at', 'updated_at' ];
this array to define which attributes that are available for sorting
- now you can sort your model query like this
App\Models\User::sortable()->get();
and the request should have query string like this :
- /users?sort[]=id,desc
- /users?sort[]=id,asc
- /users?sort[]=id,asc&sort[]=name,asc (multiple sorting)
Notes
- if query string has additional attribute that doesn't exist in the sortable array , will be ignored
##Select
- add the Filter\Traits\HasSelectable trait to your model(s):
class User extends Authenticatable { use HasSelectable; }
- add selectable array to your model(s):
/** * The attributes that can be sorted. * * @var array<string> */ protected $selectable = [ 'id', 'name', 'created_at', 'updated_at' ];
this array to define which attributes that are available for selecting
- now you can select your model query like this
App\Models\User::selectable()->get();
and the request should have query string like this :
- /users?select=id,name
Notes
- if query string has additional attribute that doesn't exist in the selectable array , will be ignored
- if query string doesn't have select , all attributes will be returned