pointybeard / laravel-filterable-model
通过 HTTP 请求查询参数为 Eloquent 模型添加过滤功能
2.0.0
2023-09-18 22:23 UTC
Requires
- php: >=8.1.0
- illuminate/database: ^9.17 || ^10.23
- illuminate/http: ^9.17 || ^10.23
- illuminate/support: ^9.17 || ^10.23
- spatie/laravel-data: ^3.9
- webmozart/assert: ^1.11
Requires (Dev)
- ext-pcov: *
- ergebnis/composer-normalize: ^2.35
- laravel/framework: ^9.0 || ^10.0
- laravel/pint: ^1.0
- nunomaduro/larastan: ^2.6
- orchestra/testbench: ^7.5 || ^8.10
- php-parallel-lint/php-console-highlighter: ^1.0
- php-parallel-lint/php-parallel-lint: ^1.3
- phpstan/extension-installer: ^1.3
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-strict-rules: ^1.2
- phpstan/phpstan-webmozart-assert: ^1.2
- thecodingmachine/phpstan-safe-rule: ^1.2
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 许可协议发布。有关详细信息,请参阅许可协议。