您可以使用實體檔案上的#[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中文網其他相關文章!