syslogic/doctrine-json-functions

此包已被弃用且不再维护。作者建议使用scienta/doctrine-json-functions包。

Doctrine的扩展集合,增加了对JSON查询函数的支持。

6.1.0 2024-04-10 07:24 UTC

README

Latest Stable Version Total Downloads License

DoctrineJsonFunctions

Doctrine 2+ 的扩展集合,增加了对JSON函数的支持。+支持MySQL、MariaDb和PostgreSQL的函数。

数据库 函数
MySQL JSON_APPEND, JSON_ARRAY, JSON_ARRAYAGG, JSON_ARRAY_APPEND, JSON_ARRAY_INSERT, JSON_CONTAINS, JSON_CONTAINS_PATH, JSON_DEPTH, JSON_EXTRACT, JSON_OVERLAPS, JSON_INSERT, JSON_KEYS, JSON_LENGTH, JSON_MERGE, JSON_MERGE_PRESERVE, JSON_MERGE_PATCH, JSON_OBJECT, JSON_OBJECTAGG, JSON_PRETTY, JSON_QUOTE, JSON_REMOVE, JSON_REPLACE, JSON_SEARCH, JSON_SET, JSON_TYPE, JSON_UNQUOTE, JSON_VALID
PostgreSQL @> (JSONB_CONTAINS), ? (JSONB_EXISTS), ?& (JSONB_EXISTS_ALL), ?| (JSONB_EXISTS_ANY), <@ (JSONB_IS_CONTAINED), JSONB_INSERT, JSON_EXTRACT_PATH, -> (JSON_GET), #> (JSON_GET_PATH), #>> (JSON_GET_PATH_TEXT), ->> (JSON_GET_TEXT)
MariaDb JSON_VALUE, JSON_EXISTS, JSON_QUERY, JSON_COMPACT, JSON_DETAILED, JSON_LOOSE, JSON_EQUALS, JSON_NORMALIZE
SQLite JSON, JSON_ARRAY, JSON_ARRAY_LENGTH, JSON_EXTRACT, JSON_GROUP_ARRAY, JSON_GROUP_OBJECT, JSON_INSERT, JSON_OBJECT, JSON_PATCH, JSON_QUOTE, JSON_REMOVE, JSON_REPLACE, JSON_SET, JSON_TYPE, JSON_VALID

目录

变更日志

每个github发布中都记录了每个版本的变更。您可以在以下位置找到概述:https://github.com/ScientaNL/DoctrineJsonFunctions/releases

安装

安装DoctrineJsonFunctions的推荐方式是通过Composer

运行以下命令来安装包

composer require scienta/doctrine-json-functions

或者,您可以下载源代码文件并解压。

测试

此仓库使用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

Doctrine文档:“DQL用户定义函数”

<?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

请注意,doctrine缺少boolean_functions条目。您可以将布尔函数注册为string_functions,并使用= true进行比较以避免DQL解析错误。例如,要检查JSONB数组中是否存在元素,请使用andWhere('JSONB_EXISTS(u.roles, :role) = true')

使用方法

请注意在创建表达式时的比较,并转义参数以使其成为有效的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',
 ));

布尔函数需要注册为字符串函数并与“true”进行比较,因为Doctrine DQL不了解布尔函数

$q = $queryBuilder
  ->select('c')
  ->from('Customer', 'c')
  ->where('JSONB_CONTAINS(c.roles, :role) = true');

 $result = $q->execute(array(
    'role' => 'ROLE_ADMIN',
 ));

使用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运算符

注意,如果兼容,您可以使用MySQL运算符与MariaDb数据库一起使用。

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运算符

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运算符的官方文档

  • JSONB_CONTAINS(jsonb, jsonb)
    • 展开为jsonb @> jsonb
  • JSONB_EXISTS(jsonb, text)
    • 作为JSONB_EXISTS(jsonb, text)执行,相当于jsonb ? text
  • JSONB_EXISTS_ALL(jsonb, array)
    • 作为JSONB_EXISTS_ALL(jsonb, array)执行,相当于jsonb ?& array
  • JSONB_EXISTS_ANY(jsonb, array)
    • 作为JSONB_EXISTS_ANY(jsonb, array)执行,相当于jsonb ?| array
  • JSONB_IS_CONTAINED(jsonb, jsonb)
    • 展开为jsonb <@ jsonb
  • JSONB_INSERT
    • 直接执行
  • JSON_EXTRACT_PATH
    • 直接执行
  • JSON_GET(jsondoc, path)
    • path为数值时展开为jsondoc->path(用于JSON数组)
    • path为非数值时展开为jsondoc->'path'(用于JSON对象)
  • JSON_GET_TEXT(jsondoc, path)
    • path为数值时展开为jsondoc->>path(用于JSON数组)
    • path为非数值时展开为jsondoc->>'path'(用于JSON对象)
  • 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_EXTRACT(json, path[, path ], ...)
    • 从格式良好的JSON中提取并返回一个或多个值。
  • JSON_INSERT(json[, path, value],...)
    • 给定零个或多个路径和值的集合,它会在json的对应路径插入每个值(不会覆盖)。
  • JSON_OBJECT(label, value[, label, value], ...)
    • 接受零个或多个参数对,并返回由这些参数组成的格式良好的JSON对象。
  • JSON_PATCH(target, patch)
    • 将补丁应用于target。
  • JSON_QUOTE(value)
    • 将SQL中的value(一个数字或字符串)转换为相应的JSON表示。
  • JSON_REMOVE(json[, path], ...)
    • 移除每个给定路径的值。
  • JSON_REPLACE(json[, path, value],...)
    • 给定零个或多个路径和值的集合,它会覆盖json中对应路径的每个值。
  • JSON_SET(json[, path, value],...)
    • 给定零个或多个路径和值的集合,它会在json的对应路径插入或覆盖每个值。
  • JSON_TYPE(json[, path])
    • 返回json最外层元素的类型或路径上的值的类型。
  • 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并在其中根据命名规则实现所需的功能。

添加新的函数

如果您想向此库添加新功能,请随意将其分支出来并创建带有您实现的pull request。请记住,更新文档以包含您的新功能。

另请参阅

dunglas/doctrine-json-odm:将普通PHP对象序列化/反序列化到JSON列。