Doctrine DBAL 4에서 사용자 정의 색인을 무시합니다.

王林
풀어 주다: 2024-07-28 00:10:32
원래의
396명이 탐색했습니다.

Ignore custom indexes on Doctrine DBAL 4

엔티티 파일의 #[ORMIndex(fields: ['fieldName'] 속성을 사용하여 데이터베이스 색인을 생성할 수 있으며 나머지는 Doctrine이 대신하여 색인을 관리하지만 제가 하도록 하겠습니다. 그 얘기는 하지 마세요

프로젝트가 성장하거나 특정 요구 사항이 요구됨에 따라 GIST, GIN, BRIN 등과 같은 사용자 정의 인덱스 유형을 사용해야 할 수도 있습니다(https://www.postgresql.org/docs/current/indexes-types.html). Doctrine은 데이터베이스 공급업체별 인덱스 유형 기본(ref) 생성을 지원하지 않습니다.

이 문제를 해결하려면 CREATE INDEX DDL을 데이터베이스에 직접 실행하거나 교리 마이그레이션 파일에 DDL을 작성하면 됩니다. 후자 옵션을 사용하면 변경 사항을 더 쉽게 배포하거나 롤백할 수 있다는 이점이 있습니다.

사용자 정의 인덱스를 생성하는 데 어떤 방법을 사용하든 Doctrine은 항상 해당 사용자 정의 인덱스를 매핑되지 않은 인덱스로 표시하므로doctrine:schema:validate를 실행하면 데이터베이스가 동기화되지 않은 경우 다음과 같은 오류가 발생합니다. Doctrine:schema:update --dump-sql 또는 Doctrine:migrations:diff를 실행하는 동안에도 마찬가지로 사용자 정의 인덱스를 제거하기 위한 DROP INDEX ... 문이 표시됩니다.

해결책

저는 이 패키지 버전을 사용하고 있습니다. (저는 이 솔루션이 동일한 주요 패키지 버전에서 작동할 것이라고 믿습니다):

  • 교리/dbal 4.0.4
  • 교리/교리번들 2.12.0

이 문제를 처리하기 위한 여러 튜토리얼을 찾았지만 만족스럽지 않습니다.

  • https://www.liip.ch/en/blog/doctrine-and-generated-columns Doctrine DBAL이 DBAL 4에서 이벤트 관리자를 제거함에 따라 더 이상 작동하지 않았습니다. (참조)
  • https://medium.com/yousign-engineering-product/ignore-custom-indexes-on-doctrine-dbal-b5131dd22071 이는 지원 중단 메시지를 표시했습니다. "platform_service" 구성 키는 Doctrine-bundle 2.9부터 더 이상 사용되지 않습니다. DBAL 4는 더 이상 연결 매개변수를 통한 사용자 정의 플랫폼 설정을 지원하지 않습니다. (참조)

여기(https://github.com/doctrine/DoctrineBundle/issues/1656)에서 platform_service 구성 교체에 대한 GitHub 문제를 발견했습니다.

이 두 페이지를 읽으면서 Doctrine 미들웨어를 통해 맞춤형 DBAL 플랫폼을 사용하는 방법에 대한 모든 정보를 얻었습니다.

  • https://github.com/doctrine/dbal/pull/5699
  • https://symfony.com/bundles/DoctrineBundle/current/middlewares.html

드디어 소스코드를 파헤친 끝에 해결책을 찾았습니다. 4개의 파일을 생성해야 합니다. 2개는 Doctrine 미들웨어에 관한 파일이고 다른 2개는 Doctrine DBAL 플랫폼 및 스키마에 관한 파일입니다.

필요에 따라 네임스페이스와 클래스 이름을 수정하세요.

<?php

declare(strict_types=1);

namespace App\Doctrine\DBAL\Middleware;

use Doctrine\DBAL\Driver;
use Doctrine\DBAL\Driver\Middleware;

final class PostgreSQLPlatformMiddleware implements Middleware
{
    #[\Override]
    public function wrap(Driver $driver): Driver
    {
        return new PostgreSQLPlatformDriver($driver);
    }
}
로그인 후 복사
<?php

declare(strict_types=1);

namespace App\Doctrine\DBAL\Middleware;

use App\Doctrine\DBAL\Platforms\PostgreSQLPlatform;
use Doctrine\DBAL\Driver\Middleware\AbstractDriverMiddleware;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\ServerVersionProvider;

final class PostgreSQLPlatformDriver extends AbstractDriverMiddleware
{
    #[\Override]
    public function getDatabasePlatform(ServerVersionProvider $versionProvider): AbstractPlatform
    {
        return new PostgreSQLPlatform();
    }
}

로그인 후 복사
<?php

declare(strict_types=1);

namespace App\Doctrine\DBAL\Platforms;

use App\Doctrine\DBAL\Schema\PostgreSQLSchemaManager;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Platforms\PostgreSQLPlatform as BasePostgreSQLPlatform;
use Doctrine\DBAL\Schema\PostgreSQLSchemaManager as BasePostgreSQLSchemaManager;
use Doctrine\DBAL\Schema\SchemaManagerFactory;

final class PostgreSQLPlatform extends BasePostgreSQLPlatform implements SchemaManagerFactory
{
    #[\Override]
    public function createSchemaManager(Connection $connection): BasePostgreSQLSchemaManager
    {
        return new PostgreSQLSchemaManager($connection, $this);
    }
}
로그인 후 복사
<?php

declare(strict_types=1);

namespace App\Doctrine\DBAL\Schema;

use Doctrine\DBAL\Schema\PostgreSQLSchemaManager as BasePostgreSQLSchemaManager;

final class PostgreSQLSchemaManager extends BasePostgreSQLSchemaManager
{
    private const array IGNORED_INDEXES = [
        'index_name_1' => true,
        'index_name_2' => true,
    ];

    #[\Override]
    protected function _getPortableTableIndexesList(array $tableIndexes, string $tableName): array
    {
        $indexes = parent::_getPortableTableIndexesList($tableIndexes, $tableName);

        foreach (array_keys($indexes) as $indexName) {
            if (isset(self::IGNORED_INDEXES[$indexName])) {
                unset($indexes[$indexName]);
            }
        }

        return $indexes;
    }
}
로그인 후 복사

위 내용은 Doctrine DBAL 4에서 사용자 정의 색인을 무시합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!