cyd622/laravel-filterable

Laravel 包,用于通过 URL 查询字符串动态过滤 Eloquent 结果。

v1.0.0 2018-05-31 06:29 UTC

This package is not auto-updated.

Last update: 2024-09-21 13:37:36 UTC


README

此包为您提供了一种方便的方法,可以根据 URL 中的查询字符串参数自动过滤 Eloquent 结果。Filterable 解析查询字符串,将其与您希望自动过滤的列进行比较,然后创建一个动态作用域,供 Eloquent 用于构建 SQL。

安装

将包添加到 composer.json 文件中的 'require' 部分

"require": {
    "cyd622/laravel-filterable": "dev-master"
},

从命令行运行 'composer dump-autoload'

#composer dump-autoload

在 app/config/app.php 中注册服务提供者。服务提供者

'providers' => array(
    \\...
    'Laravel\Filterable\FilterableServiceProvider',
    \\...
);

许可证

版权 2014 Dave Hodgins。在 MIT 许可证下发布(https://open-source.org.cn/licenses/MIT)。有关详细信息,请参阅 LICENSE 文件。 使用方法

注意:此包还包括一个版本(FilterableWrapper.php),可用于包装 DB 或 Eloquent 对象,以及一个版本(FilterableTrait.php),可作为 Eloquent 模型的 trait 使用。

Filterable.php

编辑您的 Eloquent 模型以扩展 'Laravel\Filterable\Filterable'。

class Object extends Laravel\Filterable\Filterable {
    // ...
}

FilterableWrapper.php

为 FilterableWrapper 提供一个 DB 或 Eloquent 对象。

$object = DB::table('objects');
$objects = FilterableWrapper($object);

FilterableTrait.php

class Object extends Eloquent {

   use Laravel\Filterable\FilterableTrait;

}

以下示例使用 Filterable 类!

在上面的示例中,类 Object 对应于表 'objects'。

Filterable 列

指定您希望自动过滤的列。

$columns = [ 'color', 'shape', 'total' ];

例如

 http://www.your-site/?color=blue&shape=round&total=500

您还可以为列设置别名,如果您不希望公开它们

$columns = [ 'col' => 'color', 'sha' => 'shape', 'tot' => 'total' ];

例如

http://www.your-site/?col=blue&sha=round&tot=500

要过滤结果,只需将列传递给 Eloquent 使用 filterColumns() 方法

$objects = Object::filterColumns($columns)->get()->toArray();

您还可以过滤连接

$columns = array('color' => 'objects.color',
                 'name' => 'objects.name',
                 'shape' => 'objects.shape',
                 'category' => 'cat_object.cat_id');
$objects = Object::join('cat_object', 'objects.id', '=', 'cat_object.object_id')
                   ->filterColumns($columns)
                   ->get()->toArray();

并且您可以过滤预加载

/**
 * Columns available in main query
 */
$columns = array('color' => 'objects.color',
                 'name' => 'objects.name',
                 'shape' => 'objects.shape');
$objects = Object::with(array('categories' => function($q) {
               /**
                * Columns available to sub-query
                */
               $columns = array('category' => 'cat_object.cat_id');
               $q->filterColumns($columns);
           }))->filterColumns($columns)
           ->get()
           ->toArray();

以下示例演示了如何使用查询字符串参数。 单值

?color=red

SELECT ... WHERE ... color = 'red'
?color[]=red&color[]=blue

SELECT ... WHERE ... color = 'red' OR color = 'blue'
?color[]=red&shape[]=triangle

SELECT ... WHERE ... color = 'red' AND shape = 'triangle'
?color[]=red&shape[]=triangle&bool[shape]=or

SELECT ... WHERE ... color = 'red' OR shape = 'triangle'

大于

?total=599&operator[total]=>

SELECT ... WHERE ... total > '599'

小于

?total=600&operator[total]=<

SELECT ... WHERE ... total < '600'

不等于

?shape=triangle&operator[shape]=!=

SELECT ... WHERE ... shape != 'triangle'

介于

?total[start]=900&total[end]=5000

SELECT ... WHERE ... total BETWEEN '900' AND '5000'