엔티티 파일의 #[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 ... 문이 표시됩니다.
저는 이 패키지 버전을 사용하고 있습니다. (저는 이 솔루션이 동일한 주요 패키지 버전에서 작동할 것이라고 믿습니다):
이 문제를 처리하기 위한 여러 튜토리얼을 찾았지만 만족스럽지 않습니다.
여기(https://github.com/doctrine/DoctrineBundle/issues/1656)에서 platform_service 구성 교체에 대한 GitHub 문제를 발견했습니다.
이 두 페이지를 읽으면서 Doctrine 미들웨어를 통해 맞춤형 DBAL 플랫폼을 사용하는 방법에 대한 모든 정보를 얻었습니다.
드디어 소스코드를 파헤친 끝에 해결책을 찾았습니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!