marksihor/laravel-query-filter

Laravel 查询过滤器

1.29 2024-05-24 08:47 UTC

This package is auto-updated.

Last update: 2024-09-24 09:27:11 UTC


README

安装

使用 composer 安装包

composer require marksihor/laravel-query-filter

发布配置文件(如果您愿意更改配置,则需要此步骤)

php artisan vendor:publish --provider="LaravelQueryFilter\\LaravelQueryFilterServiceProvider" --tag=config

使用方法

1. 在 Controller.php 中添加 "FiltersQueries" 特性

namespace App\Http\Controllers;

...
use LaravelQueryFilter\FiltersQueries;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests, FiltersQueries;
}

2. 在控制器中使用 "$this->filter()" 方法,如下所示:

namespace App\Http\Controllers;

...

class PostController extends Controller
{
    public function index(Request $request): JsonResponse
    {
        $collection = $this->filter(Post::query())->paginate(20);

        return response()->json([
            'data' => $collection
        ]);
    }
}

#### 3. 添加公共数组 $filterableColumns = []; // (这可以通过不使用:Schema::hasColumn($table, $column) 来检查列是否存在来提高查询速度)

namespace App\Models;

...

class Post extends Model
{
    public array $filterableColumns = ['id', 'name', 'created_at', 'etc...'];
}

配置

过滤器设置(configs/laravel_query_filter.php)

模型配置

配置模型有两种方法

  • 传递一个参数数组(在这种情况下,它们将在每次请求中处理)
  • 传递一个匿名函数(在这种情况下,可以提供额外的逻辑)

模型设置选项(如果不提供,则不会执行检查)

  • 列 - 当检索记录时将显示的列
  • 关系 - 允许检索和过滤的关系(空数组 - 禁止所有关系)
[
    ...
    'model_settings' => [
        \App\Models\Post::class => function () {
        if (!auth()->check() || !auth()->user()->isAdmin()) {
            return [
                'columns' => ['id', 'title', 'text', 'user_id'],
                'relations' => ['comments', 'user']
            ];
        }
           return [];
        },
        \App\Models\User::class => [
            'columns' => ['id', 'name', 'email'],
            'relations' => []
        ],
        // class based setting, mast implement FilterSettingsInterface
        \App\Models\Customer::class => \App\Http\Filters\CustomerFilterSettings::class
    ]
]

过滤器配置

应用程序的过滤器列在 filters 数组中列出。要禁用特定过滤器,只需从列表中删除相应的类即可。添加您自己的过滤器很简单

  • 在您的应用程序中创建新的过滤器类;
  • 实现 \LaravelQueryFilter\Filters\FilerInterface 接口,并编写过滤器的逻辑;
  • 将创建的过滤器添加到过滤器列表;

发布配置文件(如果您愿意更改配置,则需要此步骤)

php artisan vendor:publish --provider="LaravelQueryFilter\\LaravelQueryFilterServiceProvider" --tag=config

查询示例

按列过滤 (\LaravelQueryFilter\Filters\ColumnValuesFilter::class)

精确匹配

example.com/api/posts?name=Post1

包含子字符串的字符串(将可搜索的字符串用 % 字符包围)

example.com/api/posts?text=%hello%

以子字符串开头(将 % 字符放在可搜索字符串的末尾)

example.com/api/posts?text=Error%

以子字符串结尾(将 % 字符放在可搜索字符串的开头)

example.com/api/posts?text=%provident.

JSON 列过滤器(查找包含、开头、结尾的语法相同)

example.com/api/posts?data->name=John
example.com/api/posts?data__name=John

按保留词过滤 (\LaravelQueryFilter\Filters\ColumnValuesFilter::class)

值为 null 的记录

example.com/api/posts?status=null

值为 not null 的记录

example.com/api/posts?status=notNull

日期为今天的记录

example.com/api/posts?created_at=today

日期为明天的记录

example.com/api/posts?created_at=tomorrow

日期为昨天的记录

example.com/api/posts?created_at=yesterday

日期为前天

example.com/api/posts?created_at=day_before_yesterday

日期大于或等于当前日期

example.com/api/posts?created_at=future

日期小于或等于当前日期

example.com/api/posts?created_at=past

值大于或等于

example.com/api/posts?likes[from]=100

值小于或等于

example.com/api/posts?likes[to]=200

值在范围内

example.com/api/posts?likes[between]=100,200

值在列表中

example.com/api/posts?status[in]=active,disabled

值不在列表中

example.com/api/posts?status[not_in]=active,disabled

排序 (\LaravelQueryFilter\Filters\OrderFilter::class)

按升序排序

example.com/api/posts?orderBy=title&order=asc

按降序排序

example.com/api/posts?orderBy=title&order=desc

按 JSON 列排序

example.com/api/posts?orderBy=data__key&order=desc
example.com/api/posts?orderBy=data->key&order=asc

按升序/降序排序(旧方法)

example.com/api/posts?id[orderBy]=asc
example.com/api/posts?id[orderBy]=desc

选择列(\LaravelQueryFilter\Filters\SelectColumnsFilter::class)

通过提供的逗号分隔值选择列

示例:example.com/api/posts?select=id,title

检索相关记录(\LaravelQueryFilter\Filters\WithCountRelationsFilter::class)

基本

通过提供逗号分隔的关系名称直接关系

示例:example.com/api/posts?with=comments,user

通过提供点分隔的关系结构嵌套关系

示例:example.com/api/posts?with=comments.user

高级

带有额外过滤器(选择、排序、按列过滤)的直接关系

示例:example.com/api/posts?with[comments][select]=id,text,post_id&with[comments][orderBy]=id&with[comments][order] =desc&with[comments][text]=%non%

带有额外过滤器(选择、嵌套)的嵌套关系

示例:example.com/api/posts?with[user][with]=comments&with[user][select]=id&with[user][with][comments][select] =id,post_id,user_id&select=id,user_id

计数关系(\LaravelQueryFilter\Filters\WithCountRelationsFilter::class)

基本

通过提供逗号分隔的关系名称计数直接关系

示例:example.com/api/posts?withCount=comments,user

高级

通过提供关系和额外的过滤器计数直接关系

示例:example.com/api/posts?withCount[comments][user_id]=8

求和关系(\LaravelQueryFilter\Filters\WithSumRelationsFilter::class)

基本

通过提供逗号分隔的关系名称和列求和直接关系

示例:example.com/api/customers?withSum=payments.total,payments_paid.total

检索具有关系的记录(\LaravelQueryFilter\Filters\HasRelationsFilter::class)

基本

通过提供逗号分隔的关系名称

示例:example.com/api/posts?has=comments example.com/api/posts?has=comments.user

高级

通过提供带有额外过滤器的关系名称

示例:example.com/api/posts?has[comments][id]=20

检索没有关系的记录(\LaravelQueryFilter\Filters\HasNotRelationsFilter::class)

基本

通过提供逗号分隔的关系名称

示例:example.com/api/posts?hasNot=comments

高级

通过提供带有额外过滤器的关系名称

示例:example.com/api/posts?hasNot[comments][id]=13