您可以使用实体文件上的 #[ORMIndex(fields: ['fieldName'] 属性创建数据库索引,Doctrine 将为您完成剩下的工作来管理索引,但我会不谈这个。
随着您的项目增长或需要特定要求,您可能需要使用自定义索引类型,如 GIST、GIN、BRIN 等 (https://www.postgresql.org/docs/current/indexes-types.html)。 Doctrine 不支持创建开箱即用的特定于数据库供应商的索引类型(参考)。要解决这个问题,您可以直接对数据库执行 CREATE INDEX DDL,或者将 DDL 写入到doctrine-migrations 文件中。后一个选项可以让您更轻松地部署或回滚更改。
无论您使用哪种方法创建自定义索引,Doctrine 都会将这些自定义索引始终标记为未映射索引,因此如果您执行 Doctrine:schema:validate 您将收到一个错误,指出如果您的数据库不同步,同样,在执行doctrine:schema:update --dump-sql 或doctrine:migrations:diff 时,它会显示 DROP INDEX ... 语句来删除自定义索引。
解决方案
阅读这两页让我了解了如何通过 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中文网其他相关文章!