kemodev / laravel-restful-filter
在RESTful API上过滤查询的简单方法
Requires
- php: ^5.5|^7.0|^8.0
Requires (Dev)
- fakerphp/faker: ^1.15
- illuminate/database: ^8.50
- laravel/legacy-factories: ^1.1
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-18 10:23:14 UTC
README
在RESTful API上过滤查询的简单方法
兼容性
限制
- 目前仅在SQL类型数据库上工作(已在MySQL、PostgreSQL、SQL Server上测试过)
- 可能SQL查询未优化(已经检查过,但我想没有,结果很快。最后,这是你的选择)
- 通过关系排序不可用
- 过滤器
Between
和In
不可用 - 无法添加自定义逻辑
可用搜索运算符
- 小于
- 小于等于
- 大于
- 大于等于
- 等于
- LIKE
- 非
安装
使用composer安装
composer install kemodev/laravel-restful-filter
在模型上使用包
<?php namespace App; use Kemodev\RestfulFilter\Filterable; use Illuminate\Database\Eloquent\Model; class User extends Model { use Filterable; //rest of your code on model }
开始使用
首先,您需要定义您的API能够过滤哪些字段
1. 过滤
有三种可用的过滤方法
- 基本
<?php namespace App; use Kemodev\RestfulFilter\Filterable; use Illuminate\Database\Eloquent\Model; class User extends Model { use Filterable; protected $filterableColumns = [ 'email' => 'email' ]; //rest of your code on model }
- 关系
<?php namespace App; use Kemodev\RestfulFilter\Filterable; use Illuminate\Database\Eloquent\Model; class User extends Model { use Filterable; protected $filterableColumns = [ 'email' => 'email', 'role_name' => 'role.name' ]; public function role() { return $this->belongsTo(Role::class); } //rest of your code on model }
- 所有类型
<?php namespace App; use Kemodev\RestfulFilter\Filterable; use Illuminate\Database\Eloquent\Model; class User extends Model { use Filterable; protected $filterableColumns = [ 'email' => 'email', 'search' => 'first_name,last_name,role.name' ]; public function role() { return $this->belongsTo(Role::class); } //rest of your code on model }
此方法通常用于使用单个字段过滤,例如在默认的datatables中
2. 排序
<?php namespace App; use Kemodev\RestfulFilter\Filterable; use Illuminate\Database\Eloquent\Model; class User extends Model { use Filterable; protected $sortableColumns = [ 'email' => 'email' ]; //rest of your code on model }
如果您注意到,变量是关联数组,键表示URL上的查询参数,值是列名。
3. 使用
最基本的,您可以使用如下方式
<?php namespace App\Http\Controllers; use App\Users; use Illuminate\Http\Request; class UserController extends Controller { public function getAll(Request $request) { $filter = $request->except('sort'); $sort = $request->get('sort'); $data = User::searchable($filter) ->sortable($sort) ->get(); } }
使用此代码,它将假设您生成的URL如下
https://your-domain.dev?name=febryan&email=febryan@example.com&sort=name_asc
但$filter
变量具有更广泛的范围,因为您可能有其他查询参数,这些参数与过滤数据无关。我假设的最佳实践是编写如下代码
<?php namespace App\Http\Controllers; use App\Users; use Illuminate\Http\Request; class UserController extends Controller { public function getAll(Request $request) { $filter = $request->get('filters'); $sort = $request->get('sort'); $data = User::searchable($filter) ->sortable($sort) ->get(); } }
使用此代码,它将假设您生成的URL如下
https://your-domain.dev?filters[name]=febryan&filters[email]=febryan@example.com&sort=name_asc&signature=123qweasdzxc
要使用可用的搜索运算符进行过滤,您可以在查询参数中输入如下
- 小于:
filters[age]=lt:12
- 小于等于:
filters[age]=lte:12
- 大于:
filters[age]=gt:12
- 大于等于:
filters[age]=gte:12
- 等于:
filters[name]=John Doe
- LIKE:
filters[name]=like:john
- 非:
filters[name]=not:John Doe
要更改排序方向,您可以在查询参数中输入如下
- 升序:
sort=name_asc
- 降序:
sort=name_desc
或者您想声明多个排序,只需输入查询参数如下:sort=name_asc,email_desc
贡献
欢迎任何贡献!但如果你很忙,或者因为你看到我丑陋的代码而不知道如何贡献,你可以做以下事情来声明你的贡献。
为项目加星标
如果你觉得这个包很有用,并且想鼓励我维护并继续工作,只需点击星标按钮来声明你的意愿。
用一杯茶奖励我 🍵
用你国家一杯茶的价值寄给我,这样我就会有能量来维护这个包。

Ethereum: 0x8a43C741519ff8447c033E9D0a49F94A6EB76047