abdallahmohammed / laravel-eloquent-filter
一个简单的Laravel包,用于过滤模型和关系
Requires
- php: >=7.1
- laravel/framework: 5.5.*|5.6.*|5.7.*|5.8.*|^6.0|^7.0|^8.0
Requires (Dev)
- mockery/mockery: ^1.3.1
- orchestra/testbench: ~3.0
This package is auto-updated.
Last update: 2024-09-14 04:31:32 UTC
README
一个简单的Laravel和Lumen包,用于过滤模型和关系
安装
Laravel
通过composer
composer require abdallahmohammed/laravel-eloquent-filter:dev-master
编辑config/app.php(如果你使用laravel 5.5+,请跳过此步骤)
LaravelEloquentFilter\Providers\LaravelServiceProvider::class,
将包的配置复制到本地配置
php artisan vendor:publish --provider="LaravelEloquentFilter\Providers\LaravelServiceProvider"
在config/laravel-eloquent-filter.php
配置文件中。设置模型过滤器将驻留的命名空间
'namespace' => "App\\Http\\Filters\\",
Lumen
仅当您想使用
php artisan make:filter
命令时才需要此步骤。
在bootstrap/app.php
$app->register(LaravelEloquentFilter\Providers\LumenServiceProvider::class);
更改默认命名空间
在bootstrap/app.php
config(['laravel-eloquent-filter.namespace' => "App\\Http\\Filters\\"]);
使用方法
生成过滤器
您可以使用以下artisan命令创建模型过滤器
php artisan make:filter User
其中User
是您为创建过滤器而创建的Eloquent模型名称。这将创建app/Http/Filters/UserFilter.php
该命令还支持psr-4命名空间创建过滤器。
定义过滤器
在为Eloquent模型生成过滤器后,您将在过滤器目录中找到类似的内容
<?php namespace App\Http\Filters; use LaravelEloquentFilter\BaseFilter; class UserFilter extends BaseFilter { /** * Registered filters to operate upon. * * @var array */ protected $filters = [ // ]; }
如你所见,有一个受保护的属性$filters
,在那里你可以为模型定义所有过滤器。
例如
protected $filters = [ 'first_name', 'email', ];
请注意,默认情况下,空值不会被忽略,所以如果你想仅对非空值进行过滤,你必须检查该值是否为空,或者你可以简单地更改它为包配置文件
现在在定义过滤器后,让我们定义将过滤查询的方法
/** * @return \Illuminate\Eloquent\Builder */ public function firstName($value) { return $this->builder->where('first_name', $value); } /** * @return \Illuminate\Eloquent\Builder */ public function name($value) { return $this->builder->where('name', 'like', "%$value%"); }
注意:默认情况下,空值不会被忽略,所以如果你想仅对非空值进行过滤,你必须检查该值是否为空,或者你可以简单地更改它为包配置文件
现在让我们假设你想显示名为John的用户,即使过滤器不存在,你必须这样做。
public function defaultName($value)
如果过滤器name
不存在,将调用此方法
将过滤器应用于模型
在任何Eloquent模型上实现LaravelEloquentFilter\Filterable
特质
<?php namespace App; use LaravelEloquentFilter\Filterable; use Illuminate\Database\Eloquent\Model; class User extends Model { use Filterable; ... }
这使您可以访问接受BaseFilter实例的filter()
方法
namespace App\Http\Controllers; use App\Models\User; use App\Http\Filters\UserFilter; class UserController extends Controller { public function index(UserFilter $filter) { return User::filter($filter)->get(); } ... }
另一个示例
namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; use App\Http\Filters\UserFilter; class UserController extends Controller { public function index(Request $request) { return User::filter(new UserFilter($request->query()))->get(); } ... }
贡献
欢迎所有贡献!