kalimulhaq/json-query

使用 JSON 查询字符串构建 Laravel 查询

v1.0.7 2022-04-08 08:43 UTC

This package is auto-updated.

Last update: 2024-09-08 13:35:23 UTC


README

Latest Version on Packagist Total Downloads

JsonQuery 是一种针对 Laravel/Lumen API 的查询语言,可以将 JSON 查询转换为 Laravel Eloquent ORM 查询。

安装

您可以通过 composer 安装此包

composer require kalimulhaq/json-query

用法

use Illuminate\Http\Request;
use Kalimulhaq\JsonQuery\JsonQueryFacade as JsonQuery;

class UsersController extends Controller {

    public function index(Request $request) {
        $this->user = $request->user();
        $json2query = JsonQuery::init('App\User', $request->filter);
        $json2query->buildQuery();
        $json2query->buildResult($request->limit, $request->page);
        $result = $json2query->result();
        $meta = $json2query->meta();
        return response()->json(['data' => $result, 'paginator' => $meta]);
    }
}

过滤

filter 是一个有效的 JSON 字符串,其形式如下

{
  "select": [],
  "where": {},
  "order": [],
  "include": [],
  "include_count": [],
  "scopes": []
}

示例

{
  "select": ["id","first_name","last_name","email","phone"],
  "where": {
    "wildcard": {
      "fields": ["first_name","last_name","email","role.name"],
      "value": "any keyword"
    },
    "and": [
      {
        "field": "email",
        "operator": "like",
        "value": "test@email.com"
      },
      {
        "field": "phone",
        "value": "123456789"
      },
      {
        "or": [
          {
            "field": "first_name",
            "operator": "like",
            "value": "kalim"
          },
          {
            "field": "first_name",
            "operator": "like",
            "value": "juli"
          }
        ]
      },
      {
        "field": "role",
        "operator": "where_has",
        "value": {
          "and": [
            {
              "field": "name",
              "value": "admin"
            }
          ]
        }
      }
    ]
  },
  "include": [
    {
      "relation": "role",
      "select": ["id","name"],
      "include": [
        {
          "relation": "permission",
          "select": ["id","name"]
        }
      ]
    }
  ],
  "include_count": [
    {
      "relation": "task"
    }
  ],
  "order": [
    {
      "field": "first_name",
      "order": "asc"
    },
    {
      "field": "last_name",
      "order": "asc"
    }
  ]
}

选择

select 是从基础模型中选择的列的数组,如果删除 *,则将使用 *

Where

where 是一个有效的 JSON 对象,用于构造 WHERE 子句

{
  "and": [],
  "or": [],
  "field": "",
  "value": "",
  "operator": "",
  "sub_operator": ""
}

and

使用 AND 将 where 子句组合

or

使用 OR 将 where 子句组合

both andor 都是对象的数组,每个对象代表一个 where 子句

{
  "field": "",
  "value": "",
  "operator": "",
  "sub_operator": ""
}

如果删除 operator,则默认使用 =

(可选)外部的 field, value, operator, sub_operator 将创建一个单独的 where 子句,该子句将与 andor 组合使用 AND 组合。

field

列名或关系名,如果操作符是 hasnot_haswhere_haswhere_not_has,则该字段被视为关系

value

用于搜索的任何类型的值。如果操作符是 hasnot_haswhere_haswhere_not_has,则该值将是 where 类型的对象

operator

支持的运算符有 =!=<><=>=betweennot_betweeninnot_innullnot_nulldatedaymothyeartimelikehasnot_haswhere_haswhere_not_has

sub_operator

子操作符仅在 operatorhasnot_has 时需要,支持的子操作符有 =!=<><=>=

排序

排序用于对行进行排序。 order 是对象数组

[
    {
      "field": "first_name",
      "order": "asc"
    }
]

包含

为了包含相关模型。 include 是一个具有与根 filter (见上面) 对象相同结构的对象数组,并具有额外的 relation 属性。

{
  "relation":"",
  "select": [],
  "where": {},
  "order": [],
  "include": [],
  "include_count": [],
  "scopes": []
}

包含计数

为了包含相关模型的计数。 include_count 是对象数组。

{
  "relation":"",
  "where": {}
}

变更日志

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

鸣谢

许可

MIT 许可证 (MIT)。有关更多信息,请参阅 许可文件