mayoz / eloquent-filterable
为您的 Eloquent 模型查询提供过滤器。
Requires
- php: >=5.5.9
- illuminate/database: 5.1.*
Requires (Dev)
- orchestra/testbench: ~3.0
- phpunit/phpunit: ~4.0
This package is auto-updated.
Last update: 2024-08-27 22:35:44 UTC
README
使用本包,您可以优化在过滤器前后调用查询子句。您可以从单个接口管理您的查询。
安装
需要 PHP 5.5.9+ 或 HHVM,以及 Composer。
要获取 Eloquent Filterable 的最新版本,请将以下行添加到您的 composer.json
文件的 require 块中
"require": { "mayoz/eloquent-filterable": "~2.0" }
然后,您需要运行 composer install
或 composer update
来下载它并更新自动加载器。或者使用终端通过快捷方式安装
composer require mayoz/eloquent-filterable ~2.0
用法
- 创建您的查询过滤器。
- 创建您的 Eloquent 模型。
- 定义
Filterable
特性并在 Eloquent 模型中使用查询过滤器。
创建过滤器
所有过滤器都应该扩展 Mayoz\Filter\Filter
抽象类。因此,可以在过滤器中使用 before
和 after
方法。
前置方法
before
方法负责定位查询 WHERE 子句的头部。例如;我们需要查询 WHERE 子句中的 published = 1
。但是,这个子句希望在其他子句之前执行。
<?php namespace App\Filters; use Mayoz\Filter\Filter; class PublishedFilter extends Filter { /** * The first executable filter clause. * * @param mixed $query * @return void */ public function before($query) { $query->where('published', '=', 1); } }
后置方法
after
方法负责定位查询 WHERE 子句的尾部。例如,如果需要查询 WHERE 子句中的 status = 'active'
。但是,这个子句希望在其他子句之后执行。
<?php namespace App\Filters; use Mayoz\Filter\Filter; class StatusActiveFilter extends Filter { /** * The last executable filter clause. * * @param mixed $query * @return void */ public function after($query) { $query->where('status', '=', 'active'); } }
创建模型
创建您的模型文件。如果您想管理查询,请将 Filterable
特性添加到模型文件中。然后,将所有关联过滤器分配给 $filters
变量。考虑以下示例
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Mayoz\Filter\Filterable; class Post extends Model { use Filterable; /** * The attributes that should be filter. * * @var array */ protected $filters = [ 'App\Filters\StatusActiveFilter', 'App\Filters\PublishedFilter' ]; // other things... }
重要:当添加(如果需要多个前置或后置过滤器)查询子句时,过滤器的顺序很重要。前置过滤器根据参考序列添加到子句的头部。同样,后置过滤器也是如此。
调试
现在 Post
模型已准备好使用。准备好了吗?好吧,我们在测试查询。别忘了启用 查询日志 以检查模型查询。
$model = \App\Post::where('views', '>', 100)->get();
查询日志输出
SELECT * FROM `posts` WHERE `published` = 1 # added by automatic filter. AND `views` > 100 # user defined where clause AND `status` = 'active' # added by automatic filter.
为什么要使用它?
例如,您可能只想在网站上显示访客的已批准文本。但是,管理员可以查看所有内容。创建一个新的扩展过滤器
<?php namespace App\Filters; use Auth; use Mayoz\Filter\Filter; class StatusActiveFilter extends Filter { /** * The last executable filter clause. * * @param mixed $query * @return void */ public function after($query) { # assume, the `users` table has `role` field. if (array_get(Auth::user(), 'role') != 'administrator') { $query->where('status', '=', 'active'); } } }
魔法,魔法!访客将只显示活动的帖子。但是管理员可以看到所有内容。好吗?
贡献
喜欢创新和简洁。请使用问题报告所有错误或建议。遵循以下贡献步骤
- 复制仓库。
- 遵循 Laravel 编码风格。
- 如有必要,使用 unittest 检查您的更改。
- 提交所有更改。
- 推送您的提交并创建一个新的 PR。
- 等待合并 PR。
单元测试
请创建您的测试并在 PR 之前进行检查。使用以下命令
$ phpunit
许可
Eloquent Filterable 在 MIT 许可证 (MIT) 下授权。