Rumah >pembangunan bahagian belakang >tutorial php >Abaikan indeks tersuai pada Doktrin DBAL 4
Anda boleh mencipta indeks pangkalan data menggunakan atribut #[ORMIndex(fields: ['fieldName'] pada fail entiti dan Doctrine akan melakukan yang lain untuk menguruskan indeks untuk anda, tetapi saya akan tidak bercakap tentang itu
Apabila projek anda berkembang atau memerlukan keperluan khusus, anda mungkin perlu menggunakan jenis indeks tersuai seperti GIST, GIN, BRIN, dll (https://www.postgresql.org/docs/current/indexes-types.html). Doktrin tidak menyokong mencipta jenis indeks khusus vendor pangkalan data di luar kotak (rujuk).Untuk menangani isu ini, anda boleh sama ada melaksanakan CREATE INDEX DDL terus ke pangkalan data atau menulis DDL pada fail doktrin-migrasi. Pilihan terakhir memberi anda manfaat untuk menggunakan atau melancarkan semula perubahan dengan lebih mudah.
Tidak kira kaedah yang anda gunakan untuk mencipta indeks tersuai, Doktrin akan sentiasa menandakan indeks tersuai tersebut sebagai indeks tidak dipetakan oleh itu jika anda melaksanakan doktrin:schema:validate anda akan mendapat ralat yang menyatakan jika pangkalan data anda tidak segerak, sama semasa melaksanakan doctrin:schema:update --dump-sql atau doctrin:migrations:diff ia akan menunjukkan kepada anda DROP INDEX ... pernyataan untuk mengalih keluar indeks tersuai.
Penyelesaian
Membaca 2 halaman ini memberi saya semua maklumat tentang cara menggunakan platform DBAL tersuai melalui perisian tengah Doktrin:
Ubah suai ruang nama dan nama kelas mengikut keperluan anda.
<?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; } }
Atas ialah kandungan terperinci Abaikan indeks tersuai pada Doktrin DBAL 4. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!