nemesis / laravel-filter-and-sorting
过滤和排序特性
Requires
- doctrine/dbal: ^2.5
- laravel/framework: >=5.3.0
Requires (Dev)
- phpunit/phpunit: ^5.5
This package is not auto-updated.
Last update: 2024-09-16 10:56:04 UTC
README
过滤和排序特性
连接
将 FilterAndSorting 特性连接到模型。如果您想获取嵌套模型,需要声明方法 extraFields(),
该方法将返回可以在嵌套中获取的关系列表。具体如何使用将在下面说明
class SomeModel extends Model { use FilterAndSorting; ... public function extraFields() { return ['someRelation']; } ... public function someRelation() { return $this->hasOne(SomeRelation::class); } }
它作为作用域连接到模型,使用时,在查询模型时需要调用它
public function index(Request $request) { return SomeModel::setFilterAndRelationsAndSort($request)->get() }
使用过滤器
要过滤,需要使用 get 参数 filter,在其中放置包含过滤字段和参数的 json。
允许的参数
isNull - 可选参数,接受 true 或 false,添加 AND $key IS NULL 或 AND $key IS NOT NULL 到查询中
operation - 选择逻辑操作,接受 '>','<','>=','<=','<>','not in','in','like'
value - 选择值,如果使用 "operation":"in" 或 "operation":"not in",则可能为数组
from 和 to - 范围。可以单独使用。如果传入日期,将自动转换为 "计算机格式",也可以传递数字。使用 >= 和 <= 操作符,即 from 和 to 的值包含在查询中。
可以不使用参数,直接写作 {"id":1},那么将执行查询 WHERE id = 1(如果有其他选择参数,则 AND 将被插入)
查询示例
/message?filter={"created_at":{"from":"2016-02-20","to":"2016-02-24 23:59:59"}, "id":{"operation":"not in", "value":[2,3,4]}}
/message?filter={"id":{"from":2,"to":5}}
/message?filter={"id":{"to":5}} 和 /message?filter={"id":{"operation":"<=","value":5}} - 等价
/message?filter={"updated_at":{"isNull":true}}
/message?filter={"answer":{"operation":"like","value":"Partial search string"}} - 假定全文搜索,添加条件:WHERE answer LIKE "%Partial search string%"
/message?filter={"answer":"Full search string"} - 精确搜索字符串
过滤器允许对嵌套模型进行过滤
/message?filter={"user.name":"asd"}
嵌套模型必须在方法 extraFields 中允许,可以像对当前模型进行过滤一样进行过滤
使用嵌套模型过滤器
要过滤,需要使用 get 参数 filterExpand,它的工作方式与普通过滤器类似,只是过滤嵌套模型中的数据
使用排序
可以按当前模型或嵌套模型排序。排序需要传递 get 参数 sort。
默认排序为 ASC,如果需要 DESC,则在排序字段前加 "-"
排序示例
/message?sort=id
/message?sort=-id
/message?sort=user.name
获取嵌套模型
要获取嵌套模型(关系),需要在模型的 extraFields 方法中允许它们,并在请求中添加 get 参数 expand。
查询示例
/message?expand=user
响应示例
{ "id": 1, "message": "some message", "user_id": 1, ... "user": { "id": 1, "name": "Some username", ... } }