abdrzakoxa / laravel-eloquent-filter
用于过滤 Laravel 模型的可扩展方法
1.1.0
2022-04-21 03:51 UTC
Requires
- php: ^7.3|^8.0
- illuminate/database: ^6.0|^7.0|^8.0|^9.0
- illuminate/support: ^6.0|^7.0|^8.0|^9.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.19
- orchestra/testbench: ^5.0|^6.0
- phpunit/phpunit: ^9.4
This package is auto-updated.
Last update: 2024-09-21 09:20:16 UTC
README
Laravel Eloquent Filter
简介
假设我们想要根据多个参数返回用户列表。当我们导航到
/users?name=avf&roles[]=admin&roles[]=manager&roles[]=client&limit=10
$request->all()
将返回
['name' => 'avf', 'roles' => ['admin', 'manager', 'client'], 'limit' => '10']
要过滤所有这些参数,我们需要做类似的事情
<?php namespace App\Http\Controllers; use App\Models\User; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; class UserController extends Controller { public function index(Request $request) { $query = User::query(); $query->when($request->has('name'), function (Builder $builder) use ($request) { $builder->where('name', 'LIKE', '%'.$request->input('name').'%'); }); if (auth()->user()->isAdmin()) { $allowedRoles = ['admin', 'manager', 'client']; } elseif (auth()->user()->isManager()) { $allowedRoles = ['client']; } else { $allowedRoles = []; } $roles = []; foreach ((array) $request->input('roles') as $role) { if (in_array($role, $allowedRoles, true)) { $roles[] = $role; } } $query->whereHas('roles', function ($q) use ($roles) { return $q->whereIn('name', $roles); }); if ($request->has('limit') && is_numeric($request->input('limit')) && $request->input('limit') < 100) { $limit = (int) $request->input('limit'); } else { $limit = 10; } $query->limit($limit); return $query->get(); } }
使用 Eloquent Filters 过滤相同输入
<?php namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; class UserController extends Controller { public function index(Request $request) { return User::filter($request->all())->get(); } }
安装
composer require abdrzakoxa/laravel-eloquent-filter
使用方法
创建您的自定义过滤器
创建 app/EloquentFilters/NameFilter.php
文件
<?php namespace App\EloquentFilters; use Illuminate\Database\Eloquent\Builder; class NameFilter { /** * Apply the filter after validation passes & sanitize * @param string $value * @param Builder $builder */ public function handle(string $value, Builder $builder): void { $builder->where('name', $value); } /** * @param mixed $value * @return mixed */ public function sanitize($value) { return is_string($value) ? $value : ''; } /** * @param mixed $value * @return bool|string|array */ public function validate($value) { return strlen($value) > 5 && strlen($value) < 100; } }
您还可以仅使用 handle 方法
将 NameFilter 应用到模型
<?php namespace App\Models; use App\EloquentFilters\NameFilter; use Abdrzakoxa\EloquentFilter\Traits\Filterable; use Illuminate\Database\Eloquent\Model; class User extends Model { use Filterable; protected $filters = [ NameFilter::class, ]; }
可用过滤器
以下过滤器是开箱即用的
BetweenFilter
用法
BetweenFilter
是一个可用于过滤两个日期之间的过滤器
/users?approved_between[]=2020-10-03&approved_between[]=2020-11-03&created_between[]=2020-09-01&created_between[]=2020-12-01
// ... use Abdrzakoxa\EloquentFilter\Traits\Filterable; use Abdrzakoxa\EloquentFilter\Filters\BetweenFilter; class User extends Model { use Filterable; protected $filters = [ BetweenFilter::class . ':approved_at' => 'approved_between', BetweenFilter::class => 'created_between', ]; }
User::filter($request->all())->get();
LimitFilter
用法
LimitFilter
是一个可用于限制最终结果的过滤器
/users?limit=10
// ... use Abdrzakoxa\EloquentFilter\Traits\Filterable; use Abdrzakoxa\EloquentFilter\Filters\LimitFilter; class User extends Model { use Filterable; protected $filters = [ LimitFilter::class ]; }
User::filter($request->all())->get();
SortingFilter
用法
SortingFilter
是一个可用于对最终结果进行排序的过滤器
/users?sorting=asc
// ... use Abdrzakoxa\EloquentFilter\Traits\Filterable; use Abdrzakoxa\EloquentFilter\Filters\SortingFilter; class User extends Model { use Filterable; protected $filters = [ SortingFilter::class . ':approved_at' // sorting by approved_at column ]; }
User::filter($request->all())->get();
贡献
欢迎任何贡献!