balfour / laravel-query-filters
一个用于对查询构建器应用过滤器及排序的库
0.0.1-alpha
2020-02-24 11:18 UTC
Requires
- illuminate/support: ^5.7
This package is auto-updated.
Last update: 2024-09-24 14:09:30 UTC
README
一个用于对查询构建器应用过滤器及排序的库。
这个库处于早期发布阶段,正在等待单元测试。
用例
一个典型的用例是你有一个表格,表格中包含用于过滤或排序表格数据的表单字段。过滤器及排序值作为查询字符串参数传递,然后解析并应用于数据库查询或Eloquent模型。
安装
composer require balfour/laravel-query-filters
使用方法
use App\Models\User; use Balfour\LaravelQueryFilters\FilterSet; use Balfour\LaravelQueryFilters\Filters\GreaterThanFilter; use Balfour\LaravelQueryFilters\Filters\MatchesFilter; use Balfour\LaravelQueryFilters\Filters\RequiresPermission; use Balfour\LaravelQueryFilters\Sort; $filters = [ // the model field defaults to the key if not specified new GreaterThanFilter('age'), // here, we expect an input parameter 'a' which filters against the 'age' field new GreaterThanFilter('a', 'age'), new MatchesFilter('fname', 'first_name'), // if the year input isn't present, or is empty, a default filter value of 1987 is used new MatchesFilter('year', 'year', 1987), new MatchesFilter('y', 'year', function () { // the default value can also be a closure or callable return 1987; }), // here we use a decorator to restrict this filter to users with the 'filter-by-email' permission new RequiresPermission( new MatchesFilter('email'), 'filter-by-email', ), // we can force a default value if the user doesn't have permission // the user must have the 'filter-by-sales-consultant' permission to filter on this // value; otherwise, we force it to their user_id new RequiresPermission( new MatchesFilter('sales_consultant_id'), 'filter-by-sales-consultant', auth()->user()->id, ), ]; $sorts = [ new Sort('fname', 'first_name'), new Sort('fname_desc', 'first_name', 'desc'), new Sort('last_name'), new Sort('name_asc', ['first_name', 'last_name'], 'asc'), new Sort('name_desc', ['first_name', 'last_name'], 'desc'), ]; $set = new FilterSet($filters, $sorts, 'fname'); // the default sort can be the key of a valid sort, an instance of a sort or a callable // which resolves to an instance of a sort $defaultSort = new Sort('age'); $set = new FilterSet($filters, $sorts, $defaultSort); // or $set = new FilterSet($filters, $sorts, function () { return new Sort('age'); }); // you can also apply a query callback to the set // this callback can be used to manipulate the query after all filters and sorts are applied $set = new FilterSet($filters, $sorts, 'fname', function ($query) { $query->where('is_admin', true); }); // now let's apply a set of filter params $params = [ 'age' => 13, 'fname' => 'Matthew', 'sales_consultant_id' => 123, 'sort' => 'last_name', 'sort_dir' => 'desc', ]; $query = User::query(); $set->apply($query, $params); $results = $query->get(); // or $results = $query->paginate(); // we can take the query string parameters directly from a request $query = User::query(); $set->apply($query, request()->all()); $results = $query->all();