hec-franco / doctrine-json-functions
Doctrine 的扩展集,增加了对 json 查询函数的支持。
Requires
- php: ^8.1
- ext-pdo: *
- doctrine/dbal: ^3.0
- doctrine/lexer: ^2.0 || ^3.0
- doctrine/orm: ^2.14 || ^3.0
Requires (Dev)
- doctrine/annotations: ^1.13
- doctrine/coding-standard: ^8.0 || ^9.0 || ^10.0 || ^11.0
- phpunit/phpunit: ^8.0 || ^9.0 || ^10.0
- psalm/plugin-phpunit: ^0.18
- slevomat/coding-standard: ^8.4
- vimeo/psalm: ^5.2
- webmozart/assert: ^1.11
Suggests
- dunglas/doctrine-json-odm: To serialize / deserialize objects as JSON documents.
This package is auto-updated.
Last update: 2024-09-08 12:21:58 UTC
README
DoctrineJsonFunctions
Doctrine 2 的扩展集,增加了对 json 查询函数的支持。+支持 MySQL、MariaDb 和 PostgreSQL。
目录
更改日志
每个 github 发布的更改都会详细记录。您可以在这里找到概述:https://github.com/ScientaNL/DoctrineJsonFunctions/releases
安装
安装 DoctrineJsonFunctions 的推荐方式是通过 Composer。将以下依赖项添加到您的 composer.json 中
{ "require": { "scienta/doctrine-json-functions": "~5" } }
或者,您可以下载 源代码作为文件 并解压。
测试
此存储库使用 phpunit 进行测试。如果您只想运行测试,可以使用 docker composer 图像安装并运行 phpunit。有一个包含正确挂载的 docker-compose 文件,但如果您只想使用 docker,您可以运行以下内容
php8
docker run -it -v ${PWD}:/app scienta/php-composer:php8 /bin/bash -c "composer install && ./vendor/bin/phpunit"
函数注册
Doctrine ORM
<?php use Scienta\DoctrineJsonFunctions\Query\AST\Functions\Mysql as DqlFunctions; $config = new \Doctrine\ORM\Configuration(); $config->addCustomStringFunction(DqlFunctions\JsonExtract::FUNCTION_NAME, DqlFunctions\JsonExtract::class); $config->addCustomStringFunction(DqlFunctions\JsonSearch::FUNCTION_NAME, DqlFunctions\JsonSearch::class); $em = EntityManager::create($dbParams, $config); $queryBuilder = $em->createQueryBuilder();
Symfony 与 Doctrine 包
Symfony 文档:“DoctrineBundle 配置”
# config/packages/doctrine.yaml doctrine: orm: dql: string_functions: JSON_EXTRACT: Scienta\DoctrineJsonFunctions\Query\AST\Functions\Mysql\JsonExtract JSON_SEARCH: Scienta\DoctrineJsonFunctions\Query\AST\Functions\Mysql\JsonSearch
用法
在创建表达式时要注意比较,并对参数进行转义以使其成为有效的 JSON。
使用 Mysql 5.7+ JSON 运算符
$q = $queryBuilder ->select('c') ->from('Customer', 'c') ->where("JSON_CONTAINS(c.attributes, :certificates, '$.certificates') = 1"); $result = $q->execute(array( 'certificates' => '"BIO"', ));
使用 PostgreSQL 9.3+ JSON 运算符
$q = $queryBuilder ->select('c') ->from('Customer', 'c') ->where("JSON_GET_TEXT(c.attributes, 'gender') = :gender"); $result = $q->execute(array( 'gender' => 'male', ));
使用 SQLite JSON 运算符
$q = $queryBuilder ->select('c') ->from('Customer', 'c') ->where("JSON_EXTRACT(c.attributes, '$.gender') = :gender"); $result = $q->execute();
DQL 函数
该库提供了以下 DQL 函数集。
Mysql 5.7+ JSON 运算符
- JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
- 向 JSON 文档中指示的数组末尾追加值,并返回结果。
- JSON_ARRAYAGG(value)
- 将结果集聚合为单个 JSON 数组,其元素由行组成。
- JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
- 更新 JSON 文档,在文档中的数组中插入,并返回修改后的文档。
- JSON_ARRAY([val[, val] ...])
- 评估一个(可能为空)的值列表,并返回一个包含这些值的 JSON 数组。
- JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)
- 返回 0 或 1 以指示 JSON 文档是否包含在给定路径或路径中的数据。
- JSON_CONTAINS(json_doc, val[, path])
- 返回 0 或 1 以指示特定值是否包含在目标 JSON 文档中,或者如果提供了路径参数,则在目标文档的特定路径中。
- JSON_DEPTH(json_doc)
- 返回 JSON 文档的最大深度。
- JSON_EXTRACT(json_doc, path[, path] ...)
- 从与路径参数匹配的 JSON 文档的部分中返回数据。
- JSON_OVERLAPS(json_doc1, json_doc2)
- 比较两个 JSON 文档。如果两个文档具有任何共同的键值对或数组元素,则返回 true(1)。如果两个参数都是标量,则函数执行简单的相等性测试。
- JSON_INSERT(json_doc, path, val[, path, val] ...)
- 将数据插入 JSON 文档中,并返回结果。
- JSON_KEYS(json_doc[, path])
- 返回JSON对象的顶层值键作为一个JSON数组,或者,如果给出了路径参数,则返回所选路径的顶层键。
- JSON_LENGTH(json_doc[, path])
- 返回JSON文档的长度,或者,如果给出了路径参数,返回由路径指定的文档中值的长度。
- JSON_MERGE(json_doc, json_doc[, json_doc] ...)
- 合并两个或多个JSON文档,并返回合并的结果。
- JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)
- 合并两个或多个JSON文档,并返回合并的结果。如果任何参数是NULL,则返回NULL。如果任何参数不是有效的JSON文档,则发生错误。
- JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)
- 执行符合RFC 7396的合并两个或多个JSON文档,并返回合并的结果。
- JSON_OBJECT([key, val[, key, val] ...])
- 评估一个(可能为空)的键/值对列表,并返回一个包含这些对的JSON对象。
- JSON_OBJECTAGG(key, val)
- 接受两个列名或表达式作为参数,其中第一个用作键,第二个用作值,并返回一个包含键值对的JSON对象。
- JSON_PRETTY(json_val)
- 提供类似于PHP和其他语言以及数据库系统实现的JSON值的格式化打印。
- JSON_QUOTE(json_val)
- 通过用双引号字符包裹并转义内部引号和其他字符来将字符串引号化为JSON值,然后作为utf8mb4字符串返回结果。
- JSON_REMOVE(json_doc, path[, path] ...)
- 从JSON文档中删除数据,并返回结果。
- JSON_REPLACE(json_doc, path, val[, path, val] ...)
- 替换JSON文档中的现有值,并返回结果。
- JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
- 返回在JSON文档中给定字符串的路径。
- JSON_SET(json_doc, path, val[, path, val] ...)
- 在JSON文档中插入或更新数据,并返回结果。
- JSON_TYPE(json_val)
- 返回一个utf8mb4字符串,指示JSON值的类型。
- JSON_UNQUOTE(val)
- 取消JSON值引号,并将结果作为utf8mb4字符串返回。
- JSON_VALID(val)
- 返回0或1以指示值是否为有效的JSON文档。
注意,如果兼容,您可以使用MariaDb数据库中的MySQL运算符。
MariaDb 10.2.3 JSON运算符
- JSON_VALUE(json_doc, path)
- 返回由路径指定的标量。如果没有匹配项,则返回NULL。
- JSON_EXISTS(json_doc, path)
- 确定指定的JSON值是否存在于给定的数据中。如果找到,则返回1;如果没有找到,则返回0;如果任何输入为NULL,则返回NULL。
- JSON_QUERY(json_doc, path)
- 给定一个JSON文档,返回由路径指定的对象或数组。如果没有给出有效的JSON文档或没有匹配项,则返回NULL。
MariaDb 10.2.4 JSON运算符
- JSON_COMPACT(json_doc)
- 删除所有不必要的空格,以便JSON文档尽可能短。
- JSON_DETAILED(json_doc[, tab_size])
- 以最易于理解的方式表示JSON,强调嵌套结构。
- JSON_LOOSE(json_doc)
- 在JSON文档中添加空格,使其看起来更易读。
MariaDb 10.7.0 JSON运算符
- JSON_EQUALS(json_doc, json_doc)
- 检查两个JSON对象之间是否存在相等性。如果存在,则返回1;如果不等,则返回0;如果任何参数为null,则返回NULL。
- JSON_NORMALIZE(json_doc)
- 递归排序键并删除空格,允许比较JSON文档以检查相等性。
PostgreSQL 9.3+ JSON 运算符
实现了对JSON操作符的基本支持。即使在Doctrine\DBAL
v2.5版本下也能工作。JSON操作符的官方文档。
-
JSON_GET(jsondoc, path)
- 当path为数字时,扩展为
jsondoc->path
(用于JSON数组) - 当path为非数字时,扩展为
jsondoc->'path'
(用于JSON对象)
- 当path为数字时,扩展为
-
JSON_GET_TEXT(jsondoc, path)
- 当path为数字时,扩展为
jsondoc->>path
(用于JSON数组) - 当path为非数字时,扩展为
jsondoc->>'path'
(用于JSON对象)
- 当path为数字时,扩展为
-
JSON_GET_PATH(jsondoc, path)
- 扩展为
jsondoc#>'path'
- 扩展为
-
JSON_GET_PATH_TEXT(jsondoc, path)
- 扩展为
jsondoc#>>'path'
- 扩展为
请注意,不支持JSON操作符的链式调用。
SQLite JSON1扩展操作符
支持JSON1扩展文档中看到的所有标量和聚合函数。
标量函数
- JSON(json)
- 验证其参数是否为有效的JSON字符串,并返回该JSON字符串的精简版本。
- JSON_ARRAY([val[, val] ...])
- 接受零个或多个参数,并返回由这些参数组成的良好结构的JSON数组。
- JSON_ARRAY_LENGTH(json[, path])
- 返回JSON数组
json
中的元素数量,如果json
不是数组类型的JSON值,则返回0。
- 返回JSON数组
- JSON_EXTRACT(json, path[, path ], ...)
- 从良好结构的JSON中提取并返回一个或多个值。
- JSON_INSERT(json[, path, value],...)
- 给定零个或多个路径和值的集合,它将每个值插入到
json
的相应路径中(不覆盖)。
- 给定零个或多个路径和值的集合,它将每个值插入到
- JSON_OBJECT(label, value[, label, value], ...)
- 接受零个或多个参数对,并返回由这些参数组成的良好结构的JSON对象。
- JSON_PATCH(target, patch)
- 将
patch
应用于target
。
- 将
- JSON_QUOTE(value)
- 将SQL
value
(一个数字或一个字符串)转换为相应的JSON表示。
- 将SQL
- JSON_REMOVE(json[, path], ...)
- 移除每个给定的
path
中的值。
- 移除每个给定的
- JSON_REPLACE(json[, path, value],...)
- 给定零个或多个路径和值的集合,它将覆盖
json
中相应路径的每个值。
- 给定零个或多个路径和值的集合,它将覆盖
- JSON_SET(json[, path, value],...)
- 给定零个或多个路径和值的集合,它将在
json
的相应路径中插入或覆盖每个值。
- 给定零个或多个路径和值的集合,它将在
- JSON_TYPE(json[, path])
- 返回
json
的最外层元素或path
处的值的类型。
- 返回
- JSON_VALID(json)
- 如果参数
json
是良好结构的JSON,则返回1,否则返回0。
- 如果参数
聚合函数
- JSON_GROUP_ARRAY(value)
- 返回由聚合中的所有
value
组成的JSON数组。
- 返回由聚合中的所有
- JSON_GROUP_OBJECT(name, value)
- 返回由聚合中的所有
name/value
对组成的JSON对象。
- 返回由聚合中的所有
可扩展性和数据库支持
架构
平台函数类命名规则是
Scienta\DoctrineJsonFunctions\Query\AST\Functions\$platformName\$functionName
添加新平台
要添加对新平台的支持,只需创建新的文件夹Scienta\DoctrineJsonFunctions\Query\AST\Functions\$platformName
并在其中实现所需的功能,根据命名规则即可。
添加新函数
如果您想向此库添加新函数,请随意将其分叉并创建带有您实现方式的拉取请求。请记住更新文档以包含您的新函数。
另请参阅
dunglas/doctrine-json-odm:将普通的PHP对象序列化为JSON列。