ahmedwaleed / laravel-query-filter
1.0.0
2020-04-16 16:50 UTC
Requires (Dev)
- doctrine/dbal: ^2.5
- fzaninotto/faker: ~1.4
- laravel/laravel: ~7.0 | ~6.0
- mockery/mockery: ^1.1
- orchestra/testbench: ~3|~4
- phpunit/phpunit: ^8.0
- sempro/phpunit-pretty-print: ^1.0
This package is auto-updated.
Last update: 2024-09-30 01:23:05 UTC
README
此包允许您从请求参数(过滤器)中为Eloquent模型添加额外的查询。
安装
您可以通过composer安装此包。
composer require ahmedwaleed/laravel-query-filter
基本用法
通过运行以下命令创建专用的查询范围类。
php artisan make:query ScopeActiveUsersQuery
// app/Queries/ScopeActiveUsersQuery.php namespace App\Queries; use AhmedWaleed\QueryFilter\QueryScope; class ScopeActiveUsersQuery extends QueryScope { /** * Add query to applicable model * * @param \Illuminate\Database\Eloquent\Builder $builder * * @return \Illuminate\Database\Eloquent\Builder */ public function apply($builder) { // return $builder; } }
现在您需要在想要添加额外查询的模型中,使用QueryScopes
特性。
<?php namespace App; use Illuminate\Database\Eloquent\Model; use AhmedWaleed\QueryFilter\QueryScopes; class User extends Model { use QueryScopes; // }
在您的控制器方法中,您可以添加查询,如下所示
//.. public function index() { $users = User::addQuery( (new ScopeActiveUsersQuery())->when(request()->has('active')) )->get(); return view('users.index', compact('users')); } //..
添加多个查询
$users = User::addQuery( (new ScopeActiveUsersQuery())->when(request()->has('active')) )->addQuery( (new ScopeUsersLocationQuery())->when(request()->has('location')) )->get();
::when($condition)方法是可选的,如果您始终想执行查询,则可以跳过。
$users = User::addQuery(new ScopeActiveUsersQuery())->get();
您可以通过构造函数传递查询所需的其他数据。
// controller $data = ['limit' => 10, 'status' => request('active')]; $users = User::addQuery(new ScopeActiveUsersQuery($data))->get();
// App\Queries\ScopeActiveUsersQuery.php namespace App\Queries; use AhmedWaleed\QueryFilter\QueryScope; class ScopeActiveUsersQuery extends QueryScope { /** * Add query to applicable model * * @param \Illuminate\Database\Eloquent\Builder $builder * * @return \Illuminate\Database\Eloquent\Builder */ public function apply($builder) { $builder->whereStatus($this->data['status'] ?? 1) ->limit($this->data['limit'] ?? 50); return $builder; } }
一种更酷的用法
对于像上面的简单查询范围可能有些过度,但如果您有大量查询和请求过滤器,要么会增加模型或控制器的大小,这个包也适用于单一责任原则,因此对于每个范围都有一个专门的类,将来也更容易维护单个查询,而不是解析一个带有请求过滤器的复杂查询。
许可
此包受(MIT)许可。