maarsson/eloquent-getter

Laravel 的 Eloquent getter/filter/sorter 模式

2.0.5 2024-07-05 08:36 UTC

This package is auto-updated.

Last update: 2024-09-05 09:03:43 UTC


README

此包向您的 Laravel 项目添加并扩展 Eloquent 模型 getter/filter/sorter 模式。

安装

  1. 将包添加到您的 Laravel 项目中:composer require maarsson/eloquent-getter
  2. 发布配置文件:php artisan vendor:publish --tag=eloquent-getter-config

用法

可以使用该包轻松地对模型进行过滤或排序。请求中的过滤键和排序方法,如果 getter 类中没有匹配的函数,将被忽略。

  1. 为现有模型创建 getter 类:php artisan make:getter 'YourModel'

  2. Maarsson\EloquentGetter\Traits\GetterableTrait 特性添加到模型中

    namespace App\Models;
    
    use Maarsson\EloquentGetter\Traits\GetterableTrait;
    
    class YourModel
    {
        use GetterableTrait;
    }
  3. 将所需的过滤方法添加到创建的 YourModelGetter 类中。过滤方法名称必须为驼峰式,并以 Filter 结尾

    protected function nameFilter(string|null $searchString): \Illuminate\Database\Eloquent\Builder
    {
        return $this->builder->where('name', 'LIKE', '%' . $searchString . '%');
    }
  4. 使用查询中的 filter[] 参数获取过滤后的集合

    // HTTP GET ///yourmodel?filter[name]=foo
    public function index(\App\Getters\YourModelGetter $getter)
    {
        return $model
            ->filter($getter)
            ->get();
    }
  5. 将所需的排序方法添加到创建的 YourModelGetter 类中。排序方法名称必须为驼峰式,并以 Sorter 结尾

    protected function relatedModelDateSorter(): \Illuminate\Database\Eloquent\Builder
    {
        return RelatedModel::select('date')
            ->whereColumn('this_model_column', 'related_table.column');
    }
  6. 使用查询中的 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[] 默认:null
  • page 默认:1
  • per_page 默认:20
  • sort_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 许可证 许可。