hec-franco/doctrine-json-functions

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

5.4.1 2024-02-08 11:06 UTC

This package is auto-updated.

Last update: 2024-09-08 12:21:58 UTC


README

Latest Stable Version Total Downloads License

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

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

用法

在创建表达式时要注意比较,并对参数进行转义以使其成为有效的 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 运算符

注意,如果兼容,您可以使用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运算符

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对象)
  • 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)
    • patch应用于target
  • JSON_QUOTE(value)
    • 将SQL value(一个数字或一个字符串)转换为相应的JSON表示。
  • 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列。