lucasbedout/detective

此包的最新版本(1.1.3)没有可用的许可证信息。

为 Eloquent 库提供美观且易于使用的过滤功能

1.1.3 2016-10-16 19:23 UTC

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 行)的性能问题