netsells/eloquent-filters

一个简单的包,帮助您轻松组织模型查询逻辑

2.0.0 2020-11-25 16:02 UTC

This package is auto-updated.

Last update: 2024-08-27 19:21:27 UTC


README

Eloquent Filters为您提供了易于组织和添加过滤器到Eloquent模型的框架。此包的主要目的是通过帮助您将搜索/过滤逻辑提取到定义良好、专门的类中来帮助保持模型和控制器整洁。

Netsells团队创建和维护

主要功能

  • 设置非常简单。发布一个配置文件,然后将一个特质应用到您的模型上,您就完成了。
  • 为您提供了一种替代方案,以避免在模型中填充大量作用域或在控制器中填充大量查询逻辑。
  • 为在多个模型之间重复使用过滤逻辑提供基础。

安装

使用composer

composer require netsells/eloquent-filters

然后使用以下Artisan命令发布配置文件

php artisan vendor:publish --tag=eloquent-filters

用法

基本用法

一旦发布配置,将Netsells\EloquentFilters\Traits\HasFilters特质添加到您希望添加过滤器的任何模型中。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFilters;
}

接下来创建一个实现Netsells\EloquentFilters\Interfaces\FilterInterface;的过滤器类。

<?php

namespace App\Features\Filters;

use Illuminate\Database\Eloquent\Builder;
use Netsells\EloquentFilters\Interfaces\FilterInterface;

class TitleFilter implements FilterInterface
{
    public function applyFilter(Builder $query, $value): void
    {
        $query->where('title', 'like', "%{$value}%");
    }
}

注册过滤器

注册过滤器有两种方式。首先,在下面的eloquent-filters.php配置文件中的filters数组中

    /*
    |--------------------------------------------------------------------------
    | Model Filter Registration
    |--------------------------------------------------------------------------
    | This config file is used to register eloquent filters against
    | a query parameter.
    |
    | Model::class => [
    |      'query_parameter' => Filter::class,
    | ],
    |
    */

    'filters' => [
        Post::class => [
            'title' => TitleFilter::class,
        ],
    ],

或者通过将Netsells\EloquentFilters\Attributes\FiltersModel属性应用到过滤器类上。该属性接受两个参数,这两个参数是过滤器要绑定到的模型类和查询参数。

<?php

namespace App\Features\Filters;

use Illuminate\Database\Eloquent\Builder;
use Netsells\EloquentFilters\Interfaces\FilterInterface;
use Netsells\EloquentFilters\Attributes\FiltersModel;

#[FiltersModel(Post::class, 'title')]
class TitleFilter implements FilterInterface
{
    public function applyFilter(Builder $query, $value): void
    {
        $query->where('title', 'like', "%{$value}%");
    }
}

您可以通过在eloquent-filters.php配置文件中设置filter_directory值来指定查找过滤器所在的目录。默认情况下,将扫描整个app/目录。

注意 - 查询参数独立于所查询的数据库列。

最后,按照以下方式应用过滤器。

Route::get('/', function () {
    return Post::applyFilters([
            'title' => 'Laravel'
        ])->get();
});

您可以将任何iterable传递给applyFilters()方法。因此,以下所有内容也都是有效的

Route::get('/', function (Request $request) {
    return Post::applyFilters($request->all())->get();
});
Route::get('/', function (Request $request) {
    return Post::applyFilters($request->validated())->get();
});
Route::get('/', function (Request $request) {
    return Post::applyFilters($request->only('title'))->get();
});
Route::get('/', function (Request $request) {
    $collection = collect(['title' => 'laravel']);
    return Post::applyFilters($collection)->get();
});