Sie können Datenbankindizes mit dem Attribut #[ORMIndex(fields: ['fieldName']] in der Entitätsdatei erstellen und Doctrine erledigt den Rest, um den Index für Sie zu verwalten, aber ich werde es tun darüber nicht reden
Wenn Ihr Projekt wächst oder bestimmte Anforderungen erfordert, müssen Sie möglicherweise benutzerdefinierte Indextypen wie GIST, GIN, BRIN usw. verwenden (https://www.postgresql.org/docs/current/indexes-types.html). Doctrine unterstützt nicht die standardmäßige Erstellung datenbankanbieterspezifischer Indextypen (ref).
Um dieses Problem zu lösen, können Sie entweder die CREATE INDEX-DDL direkt in der Datenbank ausführen oder die DDL in die Doctrine-Migrations-Datei schreiben. Die letztere Option bietet Ihnen den Vorteil, dass Sie die Änderungen einfacher bereitstellen oder rückgängig machen können.
Unabhängig davon, welche Methode Sie zum Erstellen des benutzerdefinierten Index verwenden, markiert Doctrine diese benutzerdefinierten Indizes immer als nicht zugeordnete Indizes. Wenn Sie daher doctrine:schema:validate ausführen, erhalten Sie eine Fehlermeldung, die besagt, dass Ihre Datenbank nicht synchron ist Das Gleiche gilt, wenn Sie doctrine:schema:update --dump-sql oder doctrine:migrations:diff ausführen. Es wird Ihnen die Anweisung DROP INDEX ... angezeigt, um die benutzerdefinierten Indizes zu entfernen.
Ich verwende diese Paketversionen. (Ich glaube, dass die Lösung mit derselben Hauptversion der Pakete funktionieren wird):
Ich habe mehrere Tutorials gefunden, um damit umzugehen, aber es ist nicht zufriedenstellend:
Ich habe hier https://github.com/doctrine/DoctrineBundle/issues/1656 ein GitHub-Problem zum Ersetzen der platform_service-Konfiguration gefunden.
Durch das Lesen dieser beiden Seiten habe ich alle Informationen zur Verwendung einer benutzerdefinierten DBAL-Plattform über die Doctrine-Middleware erhalten:
Endlich, nachdem ich mich mit dem Quellcode befasst hatte, fand ich die Lösung. Sie müssen 4 Dateien erstellen, 2 Dateien beziehen sich auf die Doctrine-Middleware und 2 weitere Dateien beziehen sich auf die Doctrine DBAL-Plattform und das Doctrine-Schema.
Ändern Sie den Namespace und den Klassennamen entsprechend Ihren Anforderungen.
<?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; } }
Das obige ist der detaillierte Inhalt vonBenutzerdefinierte Indizes für Doctrine DBAL 4 ignorieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!