thecodemill/eloquent-filter

0.5 2019-09-20 23:24 UTC

This package is auto-updated.

Last update: 2024-09-21 21:14:32 UTC


README

为Eloquent模型添加简单的过滤功能。

安装

通过Composer安装EloquentFilter包

composer require thecodemill/eloquent-filter

用法

正如其名所示,此包旨在与Eloquent一起使用,因此与Laravel无缝协作。

EloquentFilter允许你在应用程序的任何模型上定义过滤处理器,使查询变得更加简单。过滤处理器与本地作用域非常相似,但通过使用Model::filter()方法,可以一次性应用任意数量的作用域,而无需链式调用各个作用域或查询修饰符。

例如。

// With query modifiers
$users = User::where('email', $request->input('email'))
    ->where('age', $request->input('age'))
    ->whereHas('subscription', function ($query) use ($request) {
        $query->where('code', $request->input('subscription'));
    })
    ->get();

// Using EloquentFilter's filter handlers
$users = User::filter($request->all())->get();

这是通过在模型本身中添加一个filters()方法来实现的。此方法应返回一个键 => 值数组,包含过滤器名称及其相应的闭包。

namespace App;

use TheCodeMill\EloquentFilter\Filterable;

class User
{
    use Filterable;
    
    /**
     * Return the filter handlers.
     *
     * @return array
     */
    public static function filters()
    {
        return [
            'email' => function ($query, $value) {
                return $query->where('email', $value);
            },
            'age' => function ($query, $value) {
                return $query->where('age', $value);
            },
            'subscription' => function ($query, $value) {
                return $query->whereHas('subscription', function ($query) use ($value) {
                    $query->where('code', $value);
                });
            }
        ];
    }
}

如果使用分页,EloquentFilter允许你在页面请求之间保持查询参数。要做到这一点,请在Blade模板中渲染分页链接,并添加在原始页面请求中存在的有效过滤器。

// Paginate models in your controller/repository/etc.
$users = User::filter($request->all())->paginate();

// In Blade, append only the valid query parameters:
{{ $users->appends(App\User::validFilters(request()->all()))->links() }}

作者