gsferro / filtereasy
模型中制作过滤器的简单通用方式
v1.4.0
2024-10-01 05:01 UTC
README
简介
FilterEasy 是一个 PHP 包,允许您以简单高效的方式对数据库查询应用过滤器。使用它,您可以创建更复杂和定制的查询,而无需编写冗长的 SQL 代码。
安装
安装
composer require gsferro/filtereasy
实现
-
在模型中添加包的 trait
Use FilterEasy;
-
该包利用 Laravel 的
Mass Assignment
标准来处理过滤器,但只有$fillable
数组中的字段会被考虑,关系字段除外,下面将进行解释。 -
默认情况下,所有项目都使用
where
子句处理。 -
如果发送了一个包含
array
的值,将使用whereIn
。- 对于
array
,在 name 中放置一个[]
,例如permission_id[]
- 对于
-
对于使用
like
操作符或强制转换为bool
的检查,需要初始化以下属性,分别如下/* |--------------------------------------------------- | FilterEasy |--------------------------------------------------- */ private array $likeFilterFields = [ // coloque os campos para like ]; private array $boolFilterFields = [ // coloque os campos bool ];
-
日期和时间的搜索
-
为了进行日期段的检查,使用以下
后缀
,不需要同时使用:start
:end
- 示例
- 使用
:start
将实现where('created_at', '>=', $value)
created_at:start
- 使用
:end
将实现where('updated_at', '<=', $value)
updated_at:end
-
要在过滤器表单(或直接在控制器中使用)中实现,只需放置 attr:
name="created_at:start"
|name="updated_at:end"
-
要实现类似
whereBetween
的查询,只需将同一字段重复两次,每个都带有后缀
- 示例
deleted_at:start
deleted_at:end
- 生成的 SQL 如下所示
where (`created_at`) >= ? and (`created_at`) <= ?
- 注意:在
v1.1
之前使用了whereDate
,但是这样无法发送也包含时间的值,如果该字段是 datetime 类型。
-
-
对于 关系
- 使用
relationName:relationField
的表示法,包将包含关系在查询中。 - 此表示法不需要出现在
$fillable
中,但relationName
必须是模型中实现的关系。- 示例
posts:title relationName = posts relationField = title
- 示例
- 如果想要使用
like
,将relationName:relationField
放入$likeFilterFields
private array $likeFilterFields = [ // demais campos "posts:title", ];
- 使用
-
如果使用
$guarded
或其他不在$fillable
中的字段- 初始化属性
$otherFilterFields
/* |--------------------------------------------------- | FilterEasy |--------------------------------------------------- */ private array $otherFilterFields = [ // coloque outros campos que não esteja no fillable ];
- 例如:
id
、uuid
、created_at
、updated_at
、deleted_at
等。
- 初始化属性
-
如果要进行
alias
或需要使用单个参数搜索多个列(在 API 中非常常见)- 初始化属性
$combinedFilterFields
- 示例
/* |--------------------------------------------------- | FilterEasy |--------------------------------------------------- */ private array $combinedFilterFields = [ 'client' => [ 'name' => 'like', 'id' => '=', 'age' => '>', ] ];
- 在这种情况下,它将检查请求中
client
位置的值,并将其使用orWhere
设置在查询中; - 例如:如果发送了如下请求:
client=123
,生成的 SQL 将是select * from users where (name like '123%' or id = 123 or age > 123)
- 在这种情况下,它将检查请求中
- 初始化属性
附加资源
- 使用
filterEasyRequest()
作为scope
,获取请求中的所有数据,无需传递参数。因为它将调用filterEasy
并传递 facaderequest()->all()
作为参数。 - 如果您使用
prettus/l5-repository
或其他用于Repository
的包,建议创建FilterEasyCriteria
类,并实现filterEasyRequest()
。- 实现如下
<?php namespace App\Criteria; use Prettus\Repository\Contracts\CriteriaInterface; use Prettus\Repository\Contracts\RepositoryInterface; class FilterEasyCriteria implements CriteriaInterface { /** * Apply criteria in query repository * * @param string $model * @return mixed */ public function apply($model, RepositoryInterface $repository) { return $model->filterEasyRequest(); } }
- 要使用,只需简单地进行
public function index(): View { // set filtereasy $this->repository->pushCriteria(new FilterEasyCriteria); return view('index', [ 'model' => $this->repository, ]); }
问题解决方案
如果您在使用 FilterEasy
时遇到任何问题,请检查以下内容
- 数据库查询是否正确。
- 过滤器是否被正确应用。
- 包的版本是否是最新的。
- 附加资源
- 如果您在模型中初始化了属性
- 如果您在模型中有一个未列出的新字段
- 如果您有一个在模型中未实现的关系
贡献
如果您想为 FilterEasy
做出贡献,请按照以下步骤操作
- 对仓库进行Fork。
- 为您的贡献创建一个分支。
- 进行必要的更改。
- 发送一个pull request。
许可证
FilterEasy 在MIT许可证下授权。请阅读 LICENSE 文件以获取更多信息。