luilliarcec / laravel-query-filter
为您的Laravel查询应用过滤器。
Requires
- php: ^7.2.5|^8.0
- laravel/framework: ^6.0|^7.0|^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.17
- orchestra/testbench: ^4.0
- phpunit/phpunit: ^8.5.8|^9.3.3
This package is auto-updated.
Last update: 2021-04-05 12:40:58 UTC
README
查询过滤器
以安全简便的方式让用户过滤数据库查询。
安装
您可以通过composer安装此包。
composer require styde/query-filter
使用方法
您可以使用make:query命令创建一个新的QueryClass,或者使用make:filter命令创建一个新的FilterClass。
一旦创建了这些类,您必须在其中集成所需的逻辑。记住,FilterClass是作为对请求进行的查询的过滤器。
您必须注意,您的Query类必须与其创建的模型关联,这是至关重要的,否则您会得到错误。
以下是一个关于使用User模型的示例。
make:query命令
php artisan make:query UserQuery
此命令将创建一个名为User Query的PHP文件,结构如下。
<?php namespace App\Queries; use Styde\QueryFilter\QueryBuilder; class UserQuery extends QueryBuilder { // }
make:query命令
php artisan make:query UserFilter
此命令将创建一个名为User Filter的PHP文件,结构如下。
<?php namespace App\Filters; use Styde\QueryFilter\AbstractFilter; class UserFilter extends AbstractFilter { /** * Get the validation rules that apply to the request filter. * * @return array */ public function rules(): array { return [ // ]; } }
一旦创建了这些类,您必须按照以下方式将QueryClass与相关模型关联。如果您不想创建QueryClass,可以使用BaseQuery Styde\LaravelQueryFilter\QueryBuilder,命令创建的查询将从此扩展。
<?php namespace App\Models; use App\Filters\UserFilter; use App\Queries\UserQuery; class User extends Authenticatable { // // We associate the query public function newEloquentBuilder($query) { return new UserQuery($query); } // We associate the filter public function newQueryFilter() { return new UserFilter; } }
或
<?php namespace App\Models; use App\Filters\UserFilter; use Styde\QueryFilter\QueryBuilder; class User extends Authenticatable { // // We associate the query public function newEloquentBuilder($query) { return new QueryBuilder($query); } // We associate the filter public function newQueryFilter() { return new UserFilter; } }
完成此操作后,我们将创建一个基本的查询过滤器和一个基本的查询,以帮助我们通过电子邮件搜索用户。
在您的UserQuery文件中
<?php namespace App\Queries; use Styde\QueryFilter\QueryBuilder; class UserQuery extends QueryBuilder { public function findByEmail($email) { return $this->where(compact('email'))->first(); } }
现在您可以在以下方式中使用此查询:
// Anywhere in your project $user = User::query()->findByEmail('luilliarcec@gmail.com');
在您的UserFilter文件中
通常,当我们创建记录列表时,通常是我们控制器中的index方法,我们会使用该情况来解释过滤器。
<?php namespace App\Filters; use Styde\QueryFilter\AbstractFilter; class UserFilter extends AbstractFilter { /** * Get the validation rules that apply to the request filter. * * @return array */ public function rules(): array { return [ 'search' => 'filled' ]; } public function search($query, $value) { return $query->where('email', 'like', "{$value}%") ->orWhere('name', 'like', "{$value}%"); } }
在您的UserController中
<?php namespace App\Http\Controllers; class UserController extends Controller { public function index() { $users = User::query()->applyFilters()->paginate(); return view('users.index', compact('users')); } }
这样,您就可以返回过滤后的记录。
注意
-
应用的是UserFilter中传递的规则所指定的过滤器,如果您想添加更多过滤器,必须在rules中放入请求中到达的输入名称,并在过滤器中创建一个以驼峰命名法命名的函数。
-
如果您为同一模型有多个过滤器类,您可以通过控制器以依赖注入的方式应用它,即使您想传递自己的值,也可以通过将一个键值对数组作为第二个参数传递来实现。
示例
在您的UserController中
<?php namespace App\Http\Controllers; use Styde\QueryFilter\Support\Sortable; class UserController extends Controller { public function index() { $otherData = [...]; $users = User::query()->applyFilters(new OtherUserFilter(), $otherData)->paginate(); return view('users.index', compact('users')); } // If you want to use the sort functionality on a collection // and not on paginated data, // you need to inject or instantiate the sortable support class. public function index(Sortable $sortable) { $otherData = [...]; $users = User::query()->applyFilters(new OtherUserFilter(), $otherData)->get(); return view('users.index', compact('users', 'sortable')); } }
变更日志
请参阅变更日志以获取最近更改的更多信息。
贡献
请参阅贡献指南以获取详细信息。
安全
如果您发现任何与安全相关的问题,请通过电子邮件admin@styde.net和luilliarcec@gmail.com联系,而不是使用问题跟踪器。
鸣谢
许可
MIT许可(MIT)。请参阅许可文件以获取更多信息。
Laravel 包模板
此包是使用Laravel 包模板生成的。
