red-fern/laravel-array-query-builder

使用数组查询优雅模型

0.3.0 2020-11-05 15:37 UTC

This package is auto-updated.

Last update: 2024-09-06 05:12:28 UTC


README

StyleCI

此包允许您使用多维数组向优雅查询构建器添加 WHERE 子句。通过遵循简单的结构,您可以链式添加多个查询条件、嵌套条件和关联查询。

$queryArray = [
    'condition' => 'or',
    'rules' => [
        [
            'field' => 'name',
            'operator' => '=',
            'value' => 'john'
        ],
        [
            'field' => 'age',
            'operator' => '>',
            'value' => 25
        ],
    ]
];

$users = User::arrayWheres($queryArray)->get();

条件 描述了匹配规则是如何应用的。在这种情况下,nameage 字段将包含在一个 OR 查询中。

上述部分将生成以下优雅查询构建器

$users = User::where('name', 'john')
            ->orWhere('age', '>', 25)
            ->get();

操作类型

在查询字段时,有几种操作符选项。这些选项包括

比较操作符

标准比较操作符,例如 =, <, >, <=, >=。以下是一个示例

$rules = [
    'field' => 'age',
    'operator' => '>=',
    'value' => 25
];

这变成

$query->where('age','>=',25);

空值检查

检查列是否为 "null""not null",例如。

$rules = [
    'field' => 'dob',
    'operator' => 'null'
];

这变成

$query->whereNull('dob');

范围查询

检查字段值是否在值数组中

$rules = [
    'field' => 'age',
    'operator' => 'between',
    'value' => [20, 50]
];

这变成

$query->whereBetween('age', [20, 50]);

在/不在值列表中

检查字段值是否为 "in""not in" 值数组

$rules = [
    'field' => 'id',
    'operator' => 'in',
    'value' => [2, 5, 6]
];

这变成

$query->whereIn('id', [2, 5, 6]);

字符串比较

检查字段值是否包含字符串。这基本上是一个通配符 like 查询的别称,例如。

$rules = [
    'field' => 'name',
    'operator' => 'contains',
    'value' => 'john'
];

这变成

$query->where('name', 'like', '%john%');

关系

您还可以使用点符号查询优雅关系。

 $queryArray = [
    'condition' => 'and',
    'rules' => [
        [
            'field' => 'name',
            'operator' => 'like',
            'value' => '%john%'
        ],
        [
            'field' => 'orders.order_date',
            'operator' => '>',
            'value' => '2019-01-01 00:00:00'
        ]
    ]
];

$users = User::arrayWheres($queryArray)->get();

在字段中使用点符号将确定它将查询,在这种情况下是 orders 关系。上述查询将变为

$users = User::where('name', 'like', '%john%')
        ->whereHas('orders', function($q) {
            $q->where('order_date', '>', '2019-01-01 00:00:00');
        })->get();

嵌套查询

您还可以添加嵌套条件来构建更复杂的查询,例如

$rules = [
    'condition' => 'and',
    'rules' => [
        [
            'condition' => 'or',
            'rules' => [
                [
                    'field' => 'name',
                    'operator' => '=',
                    'value' => 'john'
                ],
                [
                    'field' => 'name',
                    'operator' => '=',
                    'value' => 'james'
                ],
            ]
        ],
        [
            'field' => 'orders.order_date',
            'operator' => '>',
            'value' => '2010-01-01 00:00:00'
        ],
    ]
];

$users = User::arrayWheres($queryArray)->get();

上述示例显示了如何向数组添加嵌套条件规则。这遵循相同的格式,您可以嵌套到任何深度。上述示例将变为

$users = User::where(function($q) {
                $q->where('name', '=', 'john')
                    ->orWhere('name', '=', 'james');
            })
            ->whereHas('orders', function($q) {
                $q->where('order_date', '>', '2010-01-01 00:00:00');
            })->get();

未来开发

计划扩展此包的功能,将数组功能扩展到允许查询选择、连接、排序、分组等。