mykeels / laravel-filters
Provides a composable interface for data filtering with query strings
Installs: 1 496
Dependents: 1
Suggesters: 0
Security: 0
Stars: 15
Watchers: 2
Forks: 7
Open Issues: 2
Requires
- illuminate/database: ^5.6|^6.0
- illuminate/http: ^5.6|^6.0
- illuminate/support: ^5.6|^6.0
Requires (Dev)
- phpstan/phpstan: ^0.10.3
- phpunit/phpunit: ^7.3
- squizlabs/php_codesniffer: ^3.3
This package is not auto-updated.
Last update: 2024-11-07 03:37:01 UTC
README
Imagine that ...
Filter with Query String
This URL:
/users?name=myk&age=21&company=rick-and-morty&sort_age=desc
automatically knew to filter the DB query by responding with users that have their
- name containing
myk
- age as
21
- company name containing
rick-and-morty
and order the records by age in descending order, all without you having to write boilerplate code 😱.
Load Relationships
Or that you could automatically include a relationship for a model by adding a ?with_relationship
to the URL 😍, like:
Hold your horses 😜, I'm about to show you how.
Setup
- Run
composer require mykeels/laravel-filters
in your terminal to pull the package in.
Usage
- In the Model class you wish to make filterable, use the
FilterableTrait
like:
<?php use Mykeels\Filters\Traits\FilterableTrait; class User { use FilterableTrait; ... }
- Create a filter class for that model e.g.
UserFilter
<?php namespace App\Filters; use App\User; use Mykeels\Filters\BaseFilters; use Illuminate\Http\Request; use Carbon\Carbon; class UserFilters extends BaseFilters { public function name($term) { return $this->builder->where('users.name', 'LIKE', "%$term%"); } public function company($term) { return $this->builder->whereHas('company', function ($query) use ($term) { return $query->where('name', 'LIKE', "%$term%"); }); } public function age($term) { $year = Carbon::now()->subYear($age)->format('Y'); return $this->builder->where('dob', '>=', "$year-01-01")->where('dob', '<=', "$year-12-31"); } public function sort_age($type = null) { return $this->builder->orderBy('dob', (!$type || $type == 'asc') ? 'desc' : 'asc'); } }
Note how the name of each method maps to the key of each query string in
/users?name=myk&age=21&company=rick-and-morty&sort_age=desc
, and the parameters of the methods map to the values.
- Inject
UserFilters
in your controller 😍, like:
<?php namespace App\Http\Controllers; use App\User; use App\Filters\UserFilters; class UserController extends Controller { public function index(Request $request, UserFilters $filters) { return User::filter($filters)->get(); } }
That's all! 💃
Now, you can execute your app, and use variations of the query strings that your filters allow for. 🔥🔥🔥