ahmadhsalim/eloquent-filter-resolver

将基于字符串的过滤查询解析为Eloquent查询。

1.0.1 2023-07-07 16:09 UTC

This package is auto-updated.

Last update: 2024-09-07 18:26:46 UTC


README

Eloquent Filter Resolver是一个允许你在Laravel中将过滤字符串解析为Eloquent查询的包。它提供了一个方便的方式来根据各种条件和运算符过滤Eloquent模型。

安装

您可以通过Composer安装Eloquent Filter Resolver包。运行以下命令

composer require ahmadhsalim/eloquent-filter-resolver

用法

要使用Eloquent Filter Resolver,请参考以下示例

use App\Http\Controllers\Controller;
use App\Models\User;
use Salim\FilterResolver\EloquentFilterResolver;

class UserController extends Controller
{
    public function index()
    {
        $query = User::query();
        $filter = 'contains(name, "john") and eq(status, active)';

        EloquentFilterResolver::resolve($query, $filter);

        return $query->paginate();
    }
}

在上面的示例中,我们为User模型创建了一个Eloquent查询,并使用Eloquent Filter Resolver应用了一个过滤器。过滤器字符串contains(name, "john") and eq(status, active)过滤出名字包含"john"且状态为活跃的用户。

支持的运算符

Eloquent Filter Resolver支持以下运算符

  • contains:使用LIKE运算符进行不区分大小写的搜索。对于pgsql驱动程序使用ILIKE。用法:contains(field, value)
  • eq:使用=运算符进行相等比较。用法:eq(field, value)
  • ne:使用!=运算符进行不等比较。用法:ne(field, value)
  • gt:使用>运算符进行大于比较。用法:gt(field, value)
  • gte:使用>=运算符进行大于等于比较。用法:gte(field, value)
  • lt:使用<运算符进行小于比较。用法:lt(field, value)
  • lte:使用<=运算符进行小于等于比较。用法:lte(field, value)
  • in:对多个值执行IN比较。值可以用|分隔。用法:in(field, "value1|value2|value3")
  • notIn:对多个值执行NOT IN比较。值可以用|分隔。用法:notIn(field, "value1|value2|value3")

值格式

  • 字符串值可以用双引号括起来。示例:eq(name, "John Doe")
  • 字符串中的双引号可以用反斜杠(\)转义。示例:eq(name, "John \"The Man\" Doe")
  • 如果值包含逗号、括号或空格,则必须用双引号括起来。示例:eq(name, "John Doe, Jr.")

布尔值和空值

  • 当值为"true""false"时,它将被解析为布尔值。
  • 当值为"null"时,它将被解析为null

嵌套括号

Eloquent Filter Resolver支持嵌套括号以创建复杂的过滤表达式。例如

$filter = 'eq(name, "John") and (eq(status, "active") or eq(status, "inactive"))';

在上面的示例中,过滤条件检查名字是否为"John"且状态为"active"或"inactive"。

与关系一起使用

Eloquent Filter Resolver还支持使用点表示法对相关模型进行过滤。例如

$filter = 'eq(user.role.name, "admin")';

在上面的示例中,过滤条件检查用户的相关role名称是否等于"admin"。

布尔值和空值的使用

布尔值和空值可以如下用在过滤条件中

$filter = 'eq(is_active, true) and eq(deleted_at, null)';

在上面的示例中,过滤条件检查is_active字段是否为真且deleted_at字段是否为空。

贡献

欢迎为Eloquent Filter Resolver包做出贡献。如果您发现任何问题或想提出改进建议,请创建GitHub问题

许可证

Eloquent Filter Resolver包是开源软件,根据MIT许可证授权。