zgldh / laravel-query-filter
An easier way to filter Eloquent and Models. Save you from Request::input and Where hell.
dev-master
2016-02-28 16:46 UTC
Requires
- laravel/framework: ^5.1
This package is auto-updated.
Last update: 2024-10-29 04:42:01 UTC
README
An easier way to filter Eloquent and Models. Save you from Request::input and Where hell.
再也不用写一长串where语句了,再也不用查询语句贴来贴去了。
用法:
use zgldh\LaravelQueryFilter\AbstractFilter; //首先要定义一个过滤器, 继承自 AbstractFilter class UserFilter extends AbstractFilter { //该函数必须被重写, 用于定义哪些字段需要被过滤 public function columns() { $columns = [ // 参数名为 name, 数据库字段名为 username, 过滤规则为 “LIKE” (前后百分号) Column::build('name', 'username', Column::LIKE), // 参数名为 age, 数据库字段名为 age, 过滤规则为 “等于” Column::build('age'), // 参数名为 email, 数据库字段名为 email (其实无所谓), 过滤规则为回调函数 emailCallback() Column::build('email', null, [$this, 'emailCallback']), // 参数名为 created_at, 数据库字段名为 created_at, 过滤规则为 "Between" Column::build('created_at', null, Column::BETWEEN), // 参数名为 status, 数据库字段名为 status, 规则为 “等于”,默认值为 'activate' Column::build('status', null, Column::EQUAL) ->setDefaultValue('activate') ]; return $columns; } /** * @param $builder Eloquent Builder * @param Column $column 上面定义的这一列规则 * @param $value 过滤的参数值 * @return mixed 要返回一个Eloquent Builder */ public function emailCallback($builder, Column $column, $value) { //这里就跟平常写where一样。 return $builder->where('email', 'LIKE', $value.'%'); } } //实例化过滤器 $filter = new UserFilter(); //应用过滤器,得到最终结果 $users = $filter->filter(new User(), \Request::all())->get(); //在上文例子中, \Request::all() 的形式通常应该为 [ 'name'=>'zgldh', 'age'=>20 'email'=>'zg', 'created_at'=>[ 'start'=>'2012-12-12', 'end'=>'2012-12-13', ], 'status'=>null ]
安装
composer require laravel-query-filter
过滤规则
LIKE
会生成 $builder->where('key', 'like', '%'.$value.'%')
的查询。
EQUAL
会生成 $builder->where('key', $value)
的查询。
NOT_EQUAL
会生成 $builder->where('key', '<>', $value)
的查询。
GREATER_THAN
会生成 $builder->where('key', '>', $value)
的查询。
LESS_THAN
会生成 $builder->where('key', '<', $value)
的查询。
BETWEEN
要求传入参数为 $value = ['start'=>123, 'end'=>456]
的形式
会生成
```PHP
$builder->where('key', '>=', $value['start'])
->where('key', '<=', $value['end'])
```
的查询。
CALLBACK
会跳入 callback 函数, 执行其中的查询。
技巧
有时从前端传来的过滤参数被包裹在一个数组里。 如:
[ 'filters'=>[ 'name'=>'Wang', 'age'=>20 'email'=>null ] ]
则我们可以为该过滤器添加命名空间来自动脱掉外层的 filters:
use zgldh\LaravelQueryFilter\AbstractFilter; class UserFilter extends AbstractFilter { public $namespace = 'filters'; // 会自动脱去外层的 filters public function columns() { ...
待续