thecodemill / eloquent-filter
0.5
2019-09-20 23:24 UTC
Requires
- illuminate/database: >=5.0
This package is auto-updated.
Last update: 2024-09-21 21:14:32 UTC
README
为Eloquent模型添加简单的过滤功能。
安装
通过Composer安装EloquentFilter包
composer require thecodemill/eloquent-filter
用法
正如其名所示,此包旨在与Eloquent一起使用,因此与Laravel无缝协作。
EloquentFilter允许你在应用程序的任何模型上定义过滤处理器,使查询变得更加简单。过滤处理器与本地作用域非常相似,但通过使用Model::filter()
方法,可以一次性应用任意数量的作用域,而无需链式调用各个作用域或查询修饰符。
例如。
// With query modifiers $users = User::where('email', $request->input('email')) ->where('age', $request->input('age')) ->whereHas('subscription', function ($query) use ($request) { $query->where('code', $request->input('subscription')); }) ->get(); // Using EloquentFilter's filter handlers $users = User::filter($request->all())->get();
这是通过在模型本身中添加一个filters()
方法来实现的。此方法应返回一个键 => 值数组,包含过滤器名称及其相应的闭包。
namespace App; use TheCodeMill\EloquentFilter\Filterable; class User { use Filterable; /** * Return the filter handlers. * * @return array */ public static function filters() { return [ 'email' => function ($query, $value) { return $query->where('email', $value); }, 'age' => function ($query, $value) { return $query->where('age', $value); }, 'subscription' => function ($query, $value) { return $query->whereHas('subscription', function ($query) use ($value) { $query->where('code', $value); }); } ]; } }
如果使用分页,EloquentFilter允许你在页面请求之间保持查询参数。要做到这一点,请在Blade模板中渲染分页链接,并添加在原始页面请求中存在的有效过滤器。
// Paginate models in your controller/repository/etc. $users = User::filter($request->all())->paginate(); // In Blade, append only the valid query parameters: {{ $users->appends(App\User::validFilters(request()->all()))->links() }}