safoorsafdar/filterable

Laravel Eloquent 可过滤搜索功能

v1.0.0a1 2017-05-05 14:39 UTC

This package is not auto-updated.

Last update: 2024-09-20 19:55:40 UTC


README

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

Filterable 是一个包,可以帮助根据各种条件过滤 Eloquent 模型,这些条件已随包一起提供。

安装

通过 Composer

$ composer require safoorsafdar/filterable

使用方法

模型

<?php
namespace App\Models\Account;

use SafoorSafdar\Filterable\Traits\FilterableTrait;
use Illuminate\Database\Eloquent\Model;
/**
 * Class Account
 *
 * @package App\Models\Account
 */
class Account extends Model
{

    use FilterableTrait
    
    protected static $filters
        = [
            "name"         => \App\Models\Account\Filters\AccountNameFilter::class,
        ];
}

注意 $filterable 数组包含当前数据库中的表属性名称,以及将执行查询的过滤类。

过滤类

<?php
namespace App\Models\Account\Filters;

use Illuminate\Database\Eloquent\Builder;
use SafoorSafdar\Filterable\Filter\Filter;

class AccountNameFilter extends Filter
{
    /**
     * Apply a given search value to the builder instance.
     *
     * @param Builder $builder
     * @param mixed   $value
     *
     * @return Builder $builder
     */
    public static function apply(
        Builder $builder,
        $value,
        $condition,
        $operator
    ) {
        $operatorDecorator = self::createOperatorDecorator($condition);
        if (self::isValidDecorator($operatorDecorator)) {
            return app($operatorDecorator)->resolve($builder, 'name', $value,
                $operator);
        }
    }
}

控制器

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class AccountController extends Controller
{
    public function index(){
        $filters = $request->get('filter', []);
        return view('account.index')
            ->withFilterFields(\App\Models\Account\Account::filterableAttributes())
            ->withFilterCondition(\Filterable::operators())
            ->with("filtered", $filters); 
    }
    
}

视图

@include('Filterable::partial.filterable',['filtered'=>$filtered,'filter_fields'=>$filter_fields,'filter_condition'=>$filter_condition])
<script type="text/javascript" src="/js/filterable.js"></script>

将提交的过滤器应用到模型上

$query     = Account::with(['user']);
$filters   = array_filter(array_get($request->all(), 'filter', []));
if ( ! empty($filters)) {
   $query->applyFilter($filters);   
}
$result = $query->get();

变更日志

请参阅 CHANGELOG 获取有关最近更改的更多信息。

测试

$ composer test

贡献

请参阅 CONTRIBUTINGCONDUCT 了解详细信息。

安全性

如果您发现任何与安全性相关的问题,请通过电子邮件 safoor.safdar@gmail.com 而不是使用问题跟踪器。

致谢

许可

MIT 许可证 (MIT)。请参阅 许可文件 获取更多信息。