tiagomichaelsousa / laravelfilters
Laravel Filters 是一个允许以简洁方式过滤 Eloquent 模型的包。
Requires
- illuminate/support: ^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- mockery/mockery: ^1.3.1
- orchestra/testbench: ^5.0|^6.0|^9.0
- phpunit/phpunit: ^8.5|^9.0|^10.5
- sempro/phpunit-pretty-print: ^1.0
This package is auto-updated.
Last update: 2024-09-03 15:50:40 UTC
README
Laravel Filters 是一个基于 Laracasts 视频制作的包,由 JeffreyWay 创建。这个包允许以简洁、简单的方式过滤 Eloquent 模型。
安装
-
使用 Composer 安装此包
$ composer require tiagomichaelsousa/laravelfilters
该包将自动注册其服务提供者。
-
可选:如果想要更改任何默认值,请发布配置文件
php artisan vendor:publish --provider="tiagomichaelsousa\LaravelFilters\LaravelFiltersServiceProvider" --tag="config"
使用方法
创建过滤器
$ php artisan make:filter <name>
此命令将在配置文件上定义的命名空间中创建一个新的过滤器类。
更新你的 Eloquent 模型
你的模型应该使用 Filterable 特性,它有两个作用域 filter() 和 resolve()。
use tiagomichaelsousa\LaravelFilters\Traits\Filterable; class User extends Authenticatable { use Filterable; }
filter() 方法接收查询构建器和负责过滤方法的类实例。
resolve() 方法像是一个助手。它检查请求是否有查询字符串 paginate=x,如果有,则返回带有分页的响应,否则返回数据。
创建你的过滤器
当你向端点发出请求时,QueryFilter 类(它扩展了 UserFilters)会检查是否有与请求查询字符串中发送的名称相同的方法。
php artisan make:filter <name> 带有一个默认的搜索方法,如果你想要,可以删除它。当你向 /api/users?search=Foobar 发出请求时,QueryFilter 类会调用搜索方法,因为键 search 同时存在于请求和 UserFilters 类中。
use tiagomichaelsousa\LaravelFilters\QueryFilters; class UserFilters extends QueryFilters { /** * Search all. * * @param string $query * @return Builder */ public function search($value = '') { return $this->builder->where('name', 'like', '%' . $value . '%'); } }
搜索方法将对构建器实例应用查询。换句话说,你可以组合多个子句。例如,如果你想对数据库中的 name 和 last_name 字段进行搜索,只需添加 orWhere 子句。
/** * Search all. * * @param string $query * @return Builder */ public function search($value = '') { return $this->builder ->where('name', 'like', '%' . $value . '%') ->orWhere('last_name', 'like', '%' . $value . '%'); }
如果你想添加更多过滤器,只需向类中添加一个新方法,添加过滤逻辑,并通过请求查询字符串发送它。
你还可以通过 Eloquent 关联来过滤数据。例如,通过 /api/users?country=PT 过滤来自特定国家的用户
/** * Filter by country. * * @param string $country * @return Builder */ public function country($country) { return $this->builder->whereHas('address', function ($query) use ($country) { $query->where('country_code', $country); }); }
更新你的控制器
class UserControllerAPI extends Controller { /** * Display a listing of the users. * * @param \App\Filters\UserFilters $filters * @return \App\Http\Resources\Collections\UserCollection */ public function index(UserFilters $filters) { $users = User::filter($filters)->resolve(); return new UserCollection($users); }
filter() 方法可以在使用 Filterable 特性的任何模型实例中调用。所以假设你有一个模型 Meeting,这个 Meeting 有很多用户。你可以这样过滤 Meeting 的用户
class MeetingUsersControllerAPI extends Controller { /** * Display a listing of the users from a meeting. * * @param \App\Filters\UserFilters $filters * @return \App\Http\Resources\Collections\UserCollection */ public function index(Meeting $meeting, UserFilters $filters) { $users = $meeting->users()->filter($filters)->resolve(); return new UserCollection($users); }
也可以通过传递关联数组来实例化过滤器
$users = User::filter(new UserFilters(['search' => 'john']))->resolve();
变更日志
请参阅 changelog 以获取最近更改的更多信息。
测试
$ composer test
带有测试覆盖率
$ composer test-report
贡献
请参阅 contributing.md 以获取详细信息和一个待办事项列表。
安全性
如果你发现任何与安全相关的问题,请通过电子邮件 作者 而不是使用问题跟踪器。
鸣谢
许可协议
许可协议 MIT。请参阅许可文件获取更多信息。
行为准则
请参阅行为准则获取更多信息。
贡献者 ✨
感谢这些出色的人们 (表情符号键)
此项目遵循all-contributors规范。欢迎任何形式的贡献!
