lucasbedout / detective
为 Eloquent 库提供美观且易于使用的过滤功能
Requires
- php: >=5.4.0
- illuminate/database: ~5.0
This package is not auto-updated.
Last update: 2024-09-12 00:34:30 UTC
README
Eloquent 扩展,用于高级过滤。设计用于在 API 环境中使用 URL 参数。
安装
composer require lucasbedout/detective
配置
只需在模型文件中将 Eloquent 替换为 detective 模型。
use \Detective\Model as Detective; class YourModel extends Detective { // Classic eloquent class }
如果您需要关系过滤,只需列出您的关联方法,如下所示。
use \Detective\Model as Detective; class YourModel extends Detective { public static $relationships = ['relation1', 'relation2']; public function relation1() { return $this->belongsTo('Relation1'); } public function relation2() { return $this->belongsToMany('Relation2'); } }
用法示例
您可以使用包中提供的测试 Laravel 服务器来测试它,您有产品、类别和商店表,并已配置了关系。
您可以在文件底部查看所有有效语法的列表。
添加相应的路由
Route::get('/products', function() { $products = Product::filter(Input::all())->get(); return response()->json($products); });
然后只需查询它
/GET /products?name=iPhone*
将返回以 iPhone 开头的产品的列表(注意:搜索区分大小写)。
您也可以查询一个关系
/GET /products?category-name=Laptop
甚至是一个中转值
/GET /products/?category-name=Laptop&stores-pivot-quantity=>5
此查询将返回所有笔记本电脑类别中的产品,其中至少有一个商店的产品数量大于 5
您还可以使用自定义数组使用过滤方法
$array = ['name' => 'Home*', 'created_at' => '<2015-06-11']; $products = Product::filter($array)->get(); // Products in the Home% categories, created before the 11/06/2015.
过滤方法返回一个查询构建器,因此您可以链式调用您需要的任何构建器方法。
$products = Product::filter($data)->groupBy('category_id')->paginate(10);
高级信息
当您调用 Detective::filter() 方法时,Detective\Model 类会在类上下文中创建一个,它从数据库检索所有字段和类型,然后检查您的 $relationships 数组,如果有,它也会检索您的关联信息(键、类型等)。
传递给 Detective::filter()
的数组将被解析,Detective\Filters\Builder 类将在您的数组与表信息之间建立对应关系,然后构建查询。
Detective\Database\Context 类有很多有用的公共方法,请检查代码!
有效的过滤语法
3 种原子类型
- 数字
'int', 'double', 'float', 'decimal', 'tinyint'
- 字符串
'varchar', 'text', 'blob', 'longtext'
- 日期
'date', 'datetime', 'timestamp', 'time'
过滤参数名称
您可以使用多种语法,每种语法对应于一个模型属性或关系。
property
:通过对象属性过滤(例如:name=yourname)relation
:通过关系主键过滤(例如:category=1)relation-property
:通过关系属性过滤(例如:category-name=Laptop)relation-property-last
:通过最后一个关系对象的属性过滤(例如:category-name-last=Laptop),也适用于第一个)relation-pivot-property
:通过关系中转属性过滤(例如:stores-pivot-quantity=10)
过滤值格式
一旦您命名了参数,您可以提供以下值(所有语法均适用于关系或字段)
数字
id=1
:获取 id=1 的模型id=1,2
:获取 id=1 或 id=2 的模型id=10,<5
:获取 id=10 或 id<5 的模型id=5-10
:获取 id 在 5 和 10 之间的模型(SQL BETWEEN 操作符)
您可以组合
id=>5,1-10,<12,5
是一个有效的语法
字符串
name=toto
:获取名称 LIKE toto 的模型name=toto*
:获取名称 LIKE 'toto%' 的模型name=toto*,*ta*ta*
:获取名称 LIKE 'toto%' 或名称 LIKE '%ta%ta%' 的模型
日期
date=2015-03-03
:获取日期 LIKE 2015-03-03 的模型date=2015-03-03*
:获取日期 LIKE 2015-03-03% 的模型date=2015-03-03*,>2015-05-05
: 获取日期 LIKE 2015-03-03% 或日期 > 2015-05-05 的模型
订单
您还可以提供 orderby
参数。
- orderby=name : 按名称排序结果
- orderby=name,created_at : 按名称和创建日期排序结果
- direction=asc / direction=desc : orderby 参数的方向(未来将进行移动)
开发路线图
- 添加存在性检查(非空,非空)
- 添加非过滤
- 大数据量多对多查询(>100k 行)的性能问题