abdallahmohammed/laravel-eloquent-filter

一个简单的Laravel包,用于过滤模型和关系

2.0 2021-12-13 22:35 UTC

This package is auto-updated.

Last update: 2024-09-14 04:31:32 UTC


README

一个简单的Laravel和Lumen包,用于过滤模型和关系

安装

Laravel

通过composer

composer require abdallahmohammed/laravel-eloquent-filter:dev-master

编辑config/app.php(如果你使用laravel 5.5+,请跳过此步骤)

LaravelEloquentFilter\Providers\LaravelServiceProvider::class,

将包的配置复制到本地配置

php artisan vendor:publish --provider="LaravelEloquentFilter\Providers\LaravelServiceProvider"

config/laravel-eloquent-filter.php配置文件中。设置模型过滤器将驻留的命名空间

'namespace' => "App\\Http\\Filters\\",

Lumen

仅当您想使用php artisan make:filter命令时才需要此步骤。

bootstrap/app.php

$app->register(LaravelEloquentFilter\Providers\LumenServiceProvider::class);
更改默认命名空间

bootstrap/app.php

config(['laravel-eloquent-filter.namespace' => "App\\Http\\Filters\\"]);

使用方法

生成过滤器

您可以使用以下artisan命令创建模型过滤器

php artisan make:filter User

其中User是您为创建过滤器而创建的Eloquent模型名称。这将创建app/Http/Filters/UserFilter.php

该命令还支持psr-4命名空间创建过滤器。

定义过滤器

在为Eloquent模型生成过滤器后,您将在过滤器目录中找到类似的内容

<?php 

namespace App\Http\Filters;

use LaravelEloquentFilter\BaseFilter;

class UserFilter extends BaseFilter
{
    /**
     * Registered filters to operate upon.
     *
     * @var array
     */
    protected $filters = [
        //
    ];
}

如你所见,有一个受保护的属性$filters,在那里你可以为模型定义所有过滤器。

例如

protected $filters = [
    'first_name',
    'email',
];

请注意,默认情况下,空值不会被忽略,所以如果你想仅对非空值进行过滤,你必须检查该值是否为空,或者你可以简单地更改它为包配置文件

现在在定义过滤器后,让我们定义将过滤查询的方法

/**
 * @return \Illuminate\Eloquent\Builder
 */
public function firstName($value) {
    return $this->builder->where('first_name', $value);
}

/**
 * @return \Illuminate\Eloquent\Builder
 */
public function name($value) {
    return $this->builder->where('name', 'like', "%$value%");
}

注意:默认情况下,空值不会被忽略,所以如果你想仅对非空值进行过滤,你必须检查该值是否为空,或者你可以简单地更改它为包配置文件

现在让我们假设你想显示名为John的用户,即使过滤器不存在,你必须这样做。

public function defaultName($value)

如果过滤器name不存在,将调用此方法

将过滤器应用于模型

在任何Eloquent模型上实现LaravelEloquentFilter\Filterable特质

<?php

namespace App;

use LaravelEloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use Filterable;

    ...
}

这使您可以访问接受BaseFilter实例的filter()方法

namespace App\Http\Controllers;

use App\Models\User;
use App\Http\Filters\UserFilter;

class UserController extends Controller
{
    public function index(UserFilter $filter)
    {
        return User::filter($filter)->get();
    }

    ...
}

另一个示例

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Filters\UserFilter;

class UserController extends Controller
{
    public function index(Request $request)
    {
        return User::filter(new UserFilter($request->query()))->get();
    }

    ...
}

贡献

欢迎所有贡献!