adrianyg7/filterer

过滤Eloquent模型

此软件包的规范存储库似乎已消失,因此该软件包已被冻结。

1.1.0 2016-01-05 19:09 UTC

This package is not auto-updated.

Last update: 2023-05-13 11:17:13 UTC


README

为您的Eloquent模型提供轻松过滤。你是否遇到过这样一个情况:你有一份资源的列表,你想要找到符合某些标准的那些?例如,按日期范围、名称、类型、关联中相同的字段等。不再需要寻找,这个软件包就是为你准备的。

安装

Laravel版本 Packagist分支
5.0.* "adrianyg7/filterer": "1.0.*"
后续Laravel 5版本 "adrianyg7/filterer": "1.1.*"

通过Composer安装此软件包。

composer require adrianyg7/filterer

注册以下服务提供商

// config/app.php

'providers' => [
    Adrianyg7\Filterer\FiltererServiceProvider::class,
];

用法

首先,使用以下Artisan命令创建一个Filterer。

php artisan make:filterer UserFilterer

这将创建文件app/Filterers/UserFilterer.php

注意:有关此命令的更多信息,请执行php artisan -h make:filterer

<?php

namespace App\Filterers;

use Adrianyg7\Filterer\Filterer;

class UserFilterer extends Filterer
{
    /**
     * The Model class to use.
     *
     * @var string
     */
    public $model = 'App\User';

    /**
     * Apply the appropriate filters.
     *
     * @return void
     */
    public function filters()
    {
        //
    }
}

现在,假设我们想要找到所有电子邮件列中包含字符串gmail的用户。

// app/Filterers/UserFilterer.php

public function filters()
{
    $this->like('email');
}
// app/Http/routes.php

Route::get('users', function (App\Filterers\UserFilterer $filterer) {
    return $filterer->results();
});

最后,发出请求/users?email=gmail

默认情况下,你的结果将被分页。如果你想禁用此功能,可以将你的Filterer的$paginate属性设置为false

public $paginate = false;

要预加载关联到你的结果,相应地设置你的Filterer的$with属性。

public $with = [
    'roles',
];

Blade

Filterer实现了IteratorAggregate接口;这意味着,例如,你可以在视图中迭代它。

@foreach ($filterer as $user)
    // 
@endforeach

内置方法

在模型中

  • like
  • equal
  • notEqual
  • gt
  • gte
  • lt
  • lte

这些方法的第一个参数是要过滤的列,第二个参数是请求输入键,如果你没有提供它,则假设列的值。

// /users?correo_electronico=juan

$this->like('email', 'correo_electronico');

关联

  • relationLike
  • relationEqual
  • relationNotEqual
  • relationGt
  • relationGte
  • relationLt
  • relationLte

几乎与在模型中的方法相同,但将添加一个额外的参数,它是关系名称。

// /users?role_name=admin

$this->relationLike('roles', 'name', 'role_name');

要添加一个or过滤,可以将最后一个参数传递为$boolean = 'or',或使用Filterer提供的动态方法。

// /users?q=foo

$this->like('first_name', 'q')
     ->like('last_name', 'q', 'or')
     ->relationLike('roles', 'name', 'q', 'or');

// or

$this->like('first_name', 'q')
     ->orLike('last_name', 'q')
     ->orRelationLike('roles', 'name', 'q');

前面的过滤器意味着查找包含'foo'的姓名、姓氏或角色名称的用户

高级用法

要编写你自己的过滤器,创建一个如下所示的方法。

/**
 * Performs a where like clause to Builder.
 *
 * @param  string       $column
 * @param  string|null  $input
 * @param  string       $boolean
 * @return $this
 */
public function like($column, $input = null, $boolean = 'and')
{
    $input = $input ?: $column;

    if ($this->requestHas($input)) {
        $this->builder->where($column, 'like', "%{$this->input($input)}%", $boolean);
    }

    return $this;
}

或者在filters方法中直接编写逻辑。

if ($this->requestHas('email')) {
    $this->builder->where('email', 'like', "%{$this->input('email')}%");
}

Laravel 5.0

本版本存在一个错误,当使用selectRaw与绑定时会影响您的分页器,在这种情况下,请使用additionalColumns方法,过滤器将会为您构建一个功能分页器。

public function additionalColumns()
{
    $this->builder->select('*')->selectRaw('? as greeting', ['hello']);
}

对于后续的Laravel 5版本,请使用1.1.*的packagist分支,该分支不包括此逻辑,因为错误已被修复。

待办事项

  • 测试

许可协议

Mit许可协议