dmarte/filterable

易于使用的包,用于过滤 Laravel Eloquent 记录。

v1.0.6 2021-07-28 16:06 UTC

This package is auto-updated.

Last update: 2024-09-29 00:06:26 UTC


README

一个 Laravel 库,用于处理 Eloquent 模型或 Scout 数据库记录的筛选,只需一个 API。

  1. 工作原理
  2. 实现
  3. 分页
  4. 保留的查询字符串参数
  5. 限制全文列检查
  6. 可筛选查询
  7. 资源响应

工作原理

Filterable 会自动执行所需实现以从 Eloquent 模型获取记录。首先,将尝试检查是否要执行 Laravel Scout 搜索或完整的 Eloquent 模型搜索。

它还支持全文搜索。

IMPORTANT NOTE:
Filterable will return a JsonResource if the HTTP Accept is present and is application/json.

实现

// IN YOUR ELOQUENT MODEL

namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use \Dmarte\Filterable\Filterable;

class Contact extends Model {
    // Just, import the trait filterable
    use Filterable;
}
// IN YOUR CONTROLLER

use App\Models\Contact;
use Illuminate\Support\Facades\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Http\Controllers\Controller;

class ContactController extends Controller {

    public function index(Request $request) : JsonResource{
        // Just call the static function "filter" to perform the query.
        return Contact::filter($request);
        
    }
}

分页

默认情况下,Filterable 包将返回一个记录集合,如果您想要获取分页器格式,必须在请求中包含查询字符串 paginator=true

使用 ?paginator=false 响应将是

[]

使用 ?paginator=true 响应将是

{
 "data": Array,
 "meta": {
  "per_page": Number
  "current_page": Number
  "last_page": Number
  "from": Number
  "to": Number
 }
}

保留 查询字符串 参数

为了改变搜索中期望的结果,filterable 会检查您请求中的参数。

限制全文列检查

通过指定应全文可搜索的列的列表,可以基于通用标准进行全局搜索。

// IN YOUR MODEL 
// just override the method that indicate 
// the columns should be full-text filterable
/**
 * @return array
 */
protected static function fullTextColumns(): array
{
    return [
        'name',
        'description',
        //...
    ];
}

可筛选查询

当您覆盖 filterableQueries 方法时,可以为每个列创建自己的逻辑。

重要

您必须确保为每个回调返回一个 Illuminate\Support\Collection 实例。filterable 引擎将检查集合上的 "key" 以匹配请求 "key",然后期望每个值都是一个执行您所需查询的回调函数。

以下是一个示例

    // IN YOUR MODEL 
    protected function filterableQueries(): Collection
    {
        return collect([
            'team_id'    => fn(Builder $query, $column, $value) => $query->where($column, $value),
            'emitted_at' => function (Builder $query, $column, $value) {
                if (is_array($value)) {
                    return $query->whereBetween($column, $value);
                }

                return $query->where($column, $value);
            },
        ]);
    }

资源响应

您可以使用 qualifiedResource 函数更改用作响应的资源类。使用这个 static 函数,您返回资源路径。

注意 默认情况下,它将采用模型名称并附加后缀 Resource。例如,对于 \App\Models\User 模型,将尝试找到 \App\Http\Resources\UserResource

您可以通过覆盖该函数来更改此行为。

    protected static function qualifiedResource(): string
    {
        return \App\Http\Resources\ModelResource::class;
    }

通过多个模型筛选

对于全局搜索,您可以使用多模型筛选器。

        // Add column filter that will be applied to all models.
        $request->merge([
            'team_id' => $request->user()->team_id,
        ]);

        $engine = new FilterableMultiple(
            models: [
            Service::class,
            Product::class,
        ],
            request: $request
        );
        
        // Customize the query used for a given model
        $engine->query(Service::class, function (Builder $query) {
            $query->where('kind', 'service_custome_value');
        });

        // Return the collection
        return $engine->get()