maarsson / eloquent-getter
Laravel 的 Eloquent getter/filter/sorter 模式
2.0.5
2024-07-05 08:36 UTC
Requires
- php: ^8.1
- laravel/framework: ^10.0|^11.0
This package is auto-updated.
Last update: 2024-09-05 09:03:43 UTC
README
此包向您的 Laravel 项目添加并扩展 Eloquent 模型 getter/filter/sorter 模式。
安装
- 将包添加到您的 Laravel 项目中:
composer require maarsson/eloquent-getter - 发布配置文件:
php artisan vendor:publish --tag=eloquent-getter-config
用法
可以使用该包轻松地对模型进行过滤或排序。请求中的过滤键和排序方法,如果 getter 类中没有匹配的函数,将被忽略。
-
为现有模型创建 getter 类:
php artisan make:getter 'YourModel'。 -
将
Maarsson\EloquentGetter\Traits\GetterableTrait特性添加到模型中namespace App\Models; use Maarsson\EloquentGetter\Traits\GetterableTrait; class YourModel { use GetterableTrait; }
-
将所需的过滤方法添加到创建的
YourModelGetter类中。过滤方法名称必须为驼峰式,并以Filter结尾protected function nameFilter(string|null $searchString): \Illuminate\Database\Eloquent\Builder { return $this->builder->where('name', 'LIKE', '%' . $searchString . '%'); }
-
使用查询中的
filter[]参数获取过滤后的集合// HTTP GET ///yourmodel?filter[name]=foo public function index(\App\Getters\YourModelGetter $getter) { return $model ->filter($getter) ->get(); }
-
将所需的排序方法添加到创建的
YourModelGetter类中。排序方法名称必须为驼峰式,并以Sorter结尾protected function relatedModelDateSorter(): \Illuminate\Database\Eloquent\Builder { return RelatedModel::select('date') ->whereColumn('this_model_column', 'related_table.column'); }
-
使用查询中的
sort_by参数获取排序后的集合// HTTP GET ///yourmodel?sort_by=related_model_date public function index(\App\Filters\YourModelGetter $getter) { return $model ->order($getter) ->get(); }
结合过滤、排序和分页
通过辅助方法获取过滤、排序和分页的结果。
// HTTP GET ///yourmodel?filter[name]=foo&page=5&per_page=20&sort_by=related_model_date&sort_order=desc public function index(\App\Filters\YourModelGetter $getter) { return $model ->filter($getter) ->order() ->paginate(); }
以下请求参数被考虑
filter[]默认:nullpage默认:1per_page默认:20sort_by默认:'id'sort_order默认:'asc'
加载属性和关系
您甚至可以控制要获取的模型属性,包括关系(及其属性)。只需使用简单的点分隔数组传递给 withAttributes() 方法。在这个例子中,您还可以看到如何将其与分页结合使用。
// HTTP GET ///yourmodel?filter[name]=foo&page=5&per_page=20&sort_by=related_model_date&sort_order=desc public function index(\App\Filters\YourModelGetter $getter) { return $model ->filter($getter) ->order() ->paginate(); ->through( fn ($item) => $item->withAttributes([ 'id', 'name', // a model property 'finalPrice', // even a model accessor 'users' // a relation (with all of its attributes) 'users.posts:id,title', // a relations relation (with limited attributes) ]) ); }
许可证
此包是开源软件,根据 MIT 许可证 许可。