gsferro/filtereasy

模型中制作过滤器的简单通用方式

v1.4.0 2024-10-01 05:01 UTC

This package is auto-updated.

Last update: 2024-10-01 05:05:23 UTC


README

FilterEasy

Latest Version Total Downloads License

简介

FilterEasy 是一个 PHP 包,允许您以简单高效的方式对数据库查询应用过滤器。使用它,您可以创建更复杂和定制的查询,而无需编写冗长的 SQL 代码。

安装

安装

 composer require gsferro/filtereasy

实现

  1. 在模型中添加包的 trait

    Use FilterEasy;
  2. 该包利用 Laravel 的 Mass Assignment 标准来处理过滤器,但只有 $fillable 数组中的字段会被考虑,关系字段除外,下面将进行解释。

  3. 默认情况下,所有项目都使用 where 子句处理。

  4. 如果发送了一个包含 array 的值,将使用 whereIn

    • 对于 array,在 name 中放置一个 [],例如
      permission_id[]
  5. 对于使用 like 操作符或强制转换为 bool 的检查,需要初始化以下属性,分别如下

    /*
    |---------------------------------------------------
    | FilterEasy
    |---------------------------------------------------
    */
    private array $likeFilterFields = [
        // coloque os campos para like
    ];
    
    private array $boolFilterFields = [
        // coloque os campos bool
    ];
  6. 日期和时间的搜索

    1. 为了进行日期段的检查,使用以下 后缀,不需要同时使用

      1. :start
      2. :end
      • 示例
      • 使用 :start 将实现 where('created_at', '>=', $value)

        created_at:start

      • 使用 :end 将实现 where('updated_at', '<=', $value)

        updated_at:end

    2. 要在过滤器表单(或直接在控制器中使用)中实现,只需放置 attr: name="created_at:start" | name="updated_at:end"

    3. 要实现类似 whereBetween 的查询,只需将同一字段重复两次,每个都带有 后缀

      • 示例

      deleted_at:start

      deleted_at:end

    • 生成的 SQL 如下所示
      where (`created_at`) >= ? and (`created_at`) <= ?  
    1. 注意:在 v1.1 之前使用了 whereDate,但是这样无法发送也包含时间的值,如果该字段是 datetime 类型。
  7. 对于 关系

    • 使用 relationName:relationField 的表示法,包将包含关系在查询中。
    • 此表示法不需要出现在 $fillable 中,但 relationName 必须是模型中实现的关系。
      • 示例
        posts:title
        relationName = posts
        relationField = title
    • 如果想要使用 like,将 relationName:relationField 放入 $likeFilterFields
      private array  $likeFilterFields = [
          // demais campos
          "posts:title",
      ];
  8. 如果使用 $guarded 或其他不在 $fillable 中的字段

    • 初始化属性 $otherFilterFields
      /*
      |---------------------------------------------------
      | FilterEasy
      |---------------------------------------------------
      */
      private array $otherFilterFields = [
      // coloque outros campos que não esteja no fillable
      ];
    • 例如: iduuidcreated_atupdated_atdeleted_at 等。
  9. 如果要进行 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)

附加资源

  1. 使用 filterEasyRequest() 作为 scope,获取请求中的所有数据,无需传递参数。因为它将调用 filterEasy 并传递 facade request()->all() 作为参数。
  2. 如果您使用 prettus/l5-repository 或其他用于 Repository 的包,建议创建 FilterEasyCriteria 类,并实现 filterEasyRequest()
    1. 实现如下
    <?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();
        }
    }
    1. 要使用,只需简单地进行
     public function index(): View
     {
         // set filtereasy
         $this->repository->pushCriteria(new FilterEasyCriteria);
    
         return view('index', [
             'model' => $this->repository,
         ]);
     }

问题解决方案

如果您在使用 FilterEasy 时遇到任何问题,请检查以下内容

  • 数据库查询是否正确。
  • 过滤器是否被正确应用。
  • 包的版本是否是最新的。
  • 附加资源
  • 如果您在模型中初始化了属性
  • 如果您在模型中有一个未列出的新字段
  • 如果您有一个在模型中未实现的关系

贡献

如果您想为 FilterEasy 做出贡献,请按照以下步骤操作

  1. 对仓库进行Fork。
  2. 为您的贡献创建一个分支。
  3. 进行必要的更改。
  4. 发送一个pull request。

许可证

FilterEasy 在MIT许可证下授权。请阅读 LICENSE 文件以获取更多信息。