adrianyg7 / filterer
过滤Eloquent模型
此软件包的规范存储库似乎已消失,因此该软件包已被冻结。
Requires
- php: >=5.4.0
- illuminate/console: ~5.0
- illuminate/database: ~5.0
- illuminate/http: ~5.0
- illuminate/pagination: ~5.0
- illuminate/support: ~5.0
Requires (Dev)
- mockery/mockery: 0.9.*
- phpspec/phpspec: ~2.0
This package is not auto-updated.
Last update: 2023-05-13 11:17:13 UTC
README
为您的Eloquent模型提供轻松过滤。你是否遇到过这样一个情况:你有一份资源的列表,你想要找到符合某些标准的那些?例如,按日期范围、名称、类型、关联中相同的字段等。不再需要寻找,这个软件包就是为你准备的。
安装
Laravel版本 | Packagist分支 |
---|---|
5.0.* | "adrianyg7/filterer": "1.0.*" |
后续Laravel 5版本 | "adrianyg7/filterer": "1.1.*" |
通过Composer安装此软件包。
composer require adrianyg7/filterer
注册以下服务提供商
// config/app.php 'providers' => [ Adrianyg7\Filterer\FiltererServiceProvider::class, ];
用法
首先,使用以下Artisan命令创建一个Filterer。
php artisan make:filterer UserFilterer
这将创建文件app/Filterers/UserFilterer.php
。
注意:有关此命令的更多信息,请执行php artisan -h make:filterer
<?php namespace App\Filterers; use Adrianyg7\Filterer\Filterer; class UserFilterer extends Filterer { /** * The Model class to use. * * @var string */ public $model = 'App\User'; /** * Apply the appropriate filters. * * @return void */ public function filters() { // } }
现在,假设我们想要找到所有电子邮件列中包含字符串gmail
的用户。
// app/Filterers/UserFilterer.php public function filters() { $this->like('email'); }
// app/Http/routes.php Route::get('users', function (App\Filterers\UserFilterer $filterer) { return $filterer->results(); });
最后,发出请求/users?email=gmail
。
默认情况下,你的结果将被分页。如果你想禁用此功能,可以将你的Filterer的$paginate
属性设置为false
。
public $paginate = false;
要预加载关联到你的结果,相应地设置你的Filterer的$with
属性。
public $with = [ 'roles', ];
Blade
Filterer实现了IteratorAggregate
接口;这意味着,例如,你可以在视图中迭代它。
@foreach ($filterer as $user) // @endforeach
内置方法
在模型中
- like
- equal
- notEqual
- gt
- gte
- lt
- lte
这些方法的第一个参数是要过滤的列,第二个参数是请求输入键,如果你没有提供它,则假设列的值。
// /users?correo_electronico=juan $this->like('email', 'correo_electronico');
关联
- relationLike
- relationEqual
- relationNotEqual
- relationGt
- relationGte
- relationLt
- relationLte
几乎与在模型中的方法相同,但将添加一个额外的参数,它是关系名称。
// /users?role_name=admin $this->relationLike('roles', 'name', 'role_name');
要添加一个or
过滤,可以将最后一个参数传递为$boolean = 'or'
,或使用Filterer提供的动态方法。
// /users?q=foo $this->like('first_name', 'q') ->like('last_name', 'q', 'or') ->relationLike('roles', 'name', 'q', 'or'); // or $this->like('first_name', 'q') ->orLike('last_name', 'q') ->orRelationLike('roles', 'name', 'q');
前面的过滤器意味着查找包含'foo'的姓名、姓氏或角色名称的用户
。
高级用法
要编写你自己的过滤器,创建一个如下所示的方法。
/** * Performs a where like clause to Builder. * * @param string $column * @param string|null $input * @param string $boolean * @return $this */ public function like($column, $input = null, $boolean = 'and') { $input = $input ?: $column; if ($this->requestHas($input)) { $this->builder->where($column, 'like', "%{$this->input($input)}%", $boolean); } return $this; }
或者在filters
方法中直接编写逻辑。
if ($this->requestHas('email')) { $this->builder->where('email', 'like', "%{$this->input('email')}%"); }
Laravel 5.0
本版本存在一个错误,当使用selectRaw
与绑定时会影响您的分页器,在这种情况下,请使用additionalColumns
方法,过滤器将会为您构建一个功能分页器。
public function additionalColumns() { $this->builder->select('*')->selectRaw('? as greeting', ['hello']); }
对于后续的Laravel 5版本,请使用1.1.*
的packagist分支,该分支不包括此逻辑,因为错误已被修复。
待办事项
- 测试