pointybeard/laravel-filterable-model

通过 HTTP 请求查询参数为 Eloquent 模型添加过滤功能

2.0.0 2023-09-18 22:23 UTC

This package is auto-updated.

Last update: 2024-09-19 00:42:00 UTC


README

通过 HTTP 请求查询参数为 Laravel 中的 Eloquent 模型添加过滤功能

安装

> composer require pointybeard/laravel-filterable-model

用法

通过扩展 Pointybeard\FilterableModel\AbstractFilterableModel 来扩展你的 Eloquent 模型,然后使用特性 Pointybeard\FilterableModel\Traits\FilterableTrait。这将添加一个新的作用域 filter 以及以下方法到你的模型中:

  • getFilterable()
  • getSortable()
  • getSortByDefault()
  • getSortOrderDefault()

然后,添加受保护的属性 $filterable$sortable$sortByDefault$sortOrderDefault 以控制过滤行为。例如:

protected $filterable = ['title', 'category', 'tags', 'is_published'];
protected bool $sortable = true;
protected string $sortByDefault = 'published_at'; // default is 'created_at'
protected string $sortOrderDefault = 'desc'; // default is 'asc'

最后,你可以使用 ->filter() 作用域通过传递 Filter 的实例来按条件过滤结果。例如:

use App\Models\MyModel;
use Pointybeard\FilterableModel\Filter;

MyModel::filter(new Filter(
    filters: [
        'tag' => 'article',
        'is_published' => 1,
    ],
));

或者,使用 Filter::fromRequest() 方法从请求查询参数构建过滤条件,例如在你的控制器中如此:

use App\Models\MyModel;
use Pointybeard\FilterableModel\Filter;

return response()->json(
    MyModel::filter(Filter::fromRequest($request))->get(),
    Response::HTTP_OK
);

默认情况下,所有比较都是通过向数据库调用注入等于 (=) 条件语句来完成的。要使用其他比较或添加更复杂的逻辑,创建一个扩展 Pointybeard\FilterableModel\Filter 的新类,并添加你自己的方法。例如,为了使用 LIKE 比较你的 tag 字段和一个布尔比较 is_published

use Pointybeard\FilterableModel\AbstractFilterableModel;
use Pointybeard\FilterableModel\Filter;
use Illuminate\Database\Eloquent\Builder;

Class MyModelFilter extends Filter
{
    public function tag(Builder $builder, AbstractFilterableModel $model, string $value): Builder
    {
        return $builder->where('tag', 'like', "%{$value}%");
    }

    public function is_published(Builder $builder, AbstractFilterableModel $model, string $value): Builder
    {
        // Convert a string representation of true/false into an actual boolean
        $value = in_array(strtolower($value), ['1', 'true', 'yes']) ? true : false;

        return $builder->where('protected', $value);
    }
}

贡献

我们鼓励你为此项目做出贡献。请查看贡献文档了解如何参与。

支持

如果你认为你发现了一个错误,请使用GitHub 问题跟踪器进行报告。

作者

许可协议

"Laravel Filterable Model" 采用 MIT 许可协议发布。有关详细信息,请参阅许可协议