opsway/doctrine-dbal-postgresql

支持 Doctrine DBAL & DQL 的 Postgres 扩展

v2.0.0 2024-02-20 12:08 UTC

README

Latest Stable Version Total Downloads Latest Unstable Version

此组件允许您使用 Doctrine DBAL 组件管理一些本地的 PostgreSQL 数据类型、运算符和函数。

使用方法

添加到 composer.json

php composer.phar require opsway/doctrine-dbal-postgresql ~0.8

要使用新类型,您应使用 自定义映射类型 功能进行注册。

要使用新函数,您应使用 DQL 用户自定义函数 功能进行注册。

自定义类型

  • 数组整数 (integer[])
  • 数组大整数 (bigint[])
  • 文本搜索向量 (tsvector)

自定义 DQL 函数

  • CONTAINS - 'OpsWay\Doctrine\ORM\Query\AST\Functions\Contains'
  • CONTAINED - 'OpsWay\Doctrine\ORM\Query\AST\Functions\Contained'
  • GET_JSON_FIELD - 'OpsWay\Doctrine\ORM\Query\AST\Functions\GetJsonField'
  • GET_JSON_FIELD_BY_KEY - 'OpsWay\Doctrine\ORM\Query\AST\Functions\GetJsonFieldByKey'
  • GET_JSON_OBJECT - 'OpsWay\Doctrine\ORM\Query\AST\Functions\GetJsonObject'
  • GET_JSON_OBJECT_TEXT - 'OpsWay\Doctrine\ORM\Query\AST\Functions\GetJsonObjectText'
  • ANY_OP - 'OpsWay\Doctrine\ORM\Query\AST\Functions\Any'
  • ALL_OP - 'OpsWay\Doctrine\ORM\Query\AST\Functions\All'
  • ARR - 'OpsWay\Doctrine\ORM\Query\AST\Functions\Arr'
  • ARR_AGGREGATE - 'OpsWay\Doctrine\ORM\Query\AST\Functions\ArrayAggregate'
  • ARR_APPEND - 'OpsWay\Doctrine\ORM\Query\AST\Functions\ArrayAppend'
  • ARR_REPLACE - 'OpsWay\Doctrine\ORM\Query\AST\Functions\ArrayReplace'
  • REGEXP_REPLACE - 'OpsWay\Doctrine\ORM\Query\AST\Functions\RegexpReplace'
  • ARR_REMOVE - 'OpsWay\Doctrine\ORM\Query\AST\Functions\ArrayRemove'
  • ARR_CONTAINS - 'OpsWay\Doctrine\ORM\Query\AST\Functions\ArrayContains'
  • TO_TSQUERY - 'OpsWay\Doctrine\ORM\Query\AST\Functions\ToTsquery'
  • TO_TSVECTOR - 'OpsWay\Doctrine\ORM\Query\AST\Functions\ToTsvector'
  • TS_CONCAT_OP - 'OpsWay\Doctrine\ORM\Query\AST\Functions\TsConcat'
  • TS_MATCH_OP - 'OpsWay\Doctrine\ORM\Query\AST\Functions\TsMatch'
  • UNNEST - 'OpsWay\Doctrine\ORM\Query\AST\Functions\Unnest'
  • JSON_AGG - 'OpsWay\Doctrine\ORM\Query\AST\Functions\JsonAgg'
  • JSONB_ARRAY_ELEM_TEXT - 'OpsWay\Doctrine\ORM\Query\AST\Functions\JsonbArrayElementsText'

自定义 DQL 函数使用示例

例如,CONTAINS 函数要求您的数据库表列类型为 jsonb。否则,PostgreSQL 将无法识别执行此操作所需的运算符。 (@>)

  • 提示:根据您要使用的函数,请检查是否有任何特定的列类型要求。

示例查询

$result = $this->em->createQuery(
    'SELECT l FROM Foo\Bar\Baz l WHERE CONTAINS(l.metaData, :value) = true')
    ->setParameter('value', json_encode(['foo'=>'bar']))
    ->getResult();

将列类型设置为 jsonb

/**
 * @var array
 *
 * @ORM\Column(type="json", nullable=true, options={"jsonb": true})
 */
private $metaData;

注意:如果您想在现有的 json 字段上使用这些 DQL 函数,您必须更改其列类型(添加 options={"jsonb": true} 后运行 make:migration 不足以完成此操作)。以下迁移示例展示了您如何操作:

<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

final class VersionXXX extends AbstractMigration
{
    public function up(Schema $schema): void
    {
        $this->addSql('ALTER TABLE "user" ALTER COLUMN roles SET DATA TYPE jsonb');
    }

    public function down(Schema $schema): void
    {
        $this->addSql('ALTER TABLE "user" ALTER COLUMN roles SET DATA TYPE json');
    }
}