mykeels / laravel-filters
提供了一种使用查询字符串进行数据过滤的可组合接口
dev-master
2019-09-27 12:50 UTC
Requires
- illuminate/database: ^5.6|^6.0
- illuminate/http: ^5.6|^6.0
- illuminate/support: ^5.6|^6.0
Requires (Dev)
- phpstan/phpstan: ^0.10.3
- phpunit/phpunit: ^7.3
- squizlabs/php_codesniffer: ^3.3
This package is not auto-updated.
Last update: 2024-09-26 03:05:25 UTC
README
想象一下 ...
使用查询字符串进行过滤
这个URL
/users?name=myk&age=21&company=rick-and-morty&sort_age=desc
自动知道通过响应包含 myk
的用户来过滤数据库查询
- 年龄为
21
- 公司名称包含
rick-and-morty
- 并且按年龄降序排列记录,所有这些都无需你编写样板代码 😱。
加载关系
或者你可以通过在URL中添加 ?with_relationship
自动包含模型的关系,比如
等等,我马上就要向你展示了 😍。
别急,我马上就要展示了 😜。
设置
- 在终端运行
composer require mykeels/laravel-filters
来引入这个包。
使用方法
- 在你想进行过滤的模型类中,使用
FilterableTrait
<?php use Mykeels\Filters\Traits\FilterableTrait; class User { use FilterableTrait; ... }
- 为该模型创建一个过滤器类,例如
UserFilter
<?php namespace App\Filters; use App\User; use Mykeels\Filters\BaseFilters; use Illuminate\Http\Request; use Carbon\Carbon; class UserFilters extends BaseFilters { public function name($term) { return $this->builder->where('users.name', 'LIKE', "%$term%"); } public function company($term) { return $this->builder->whereHas('company', function ($query) use ($term) { return $query->where('name', 'LIKE', "%$term%"); }); } public function age($term) { $year = Carbon::now()->subYear($age)->format('Y'); return $this->builder->where('dob', '>=', "$year-01-01")->where('dob', '<=', "$year-12-31"); } public function sort_age($type = null) { return $this->builder->orderBy('dob', (!$type || $type == 'asc') ? 'desc' : 'asc'); } }
注意每个方法的名称如何映射到查询字符串中的每个键,例如
/users?name=myk&age=21&company=rick-and-morty&sort_age=desc
,以及方法参数如何映射到值。
- 在你的控制器中注入
UserFilters
😍
<?php namespace App\Http\Controllers; use App\User; use App\Filters\UserFilters; class UserController extends Controller { public function index(Request $request, UserFilters $filters) { return User::filter($filters)->get(); } }
这就完了! 💃
现在,你可以启动你的应用程序,并使用过滤器允许的查询字符串变体。 🔥🔥🔥