Rumah >pembangunan bahagian belakang >tutorial php >Abaikan indeks tersuai pada Doktrin DBAL 4

Abaikan indeks tersuai pada Doktrin DBAL 4

王林
王林asal
2024-07-28 00:10:32511semak imbas

Ignore custom indexes on Doctrine 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

Saya menggunakan versi pakej ini. (Saya percaya penyelesaiannya akan berfungsi pada versi utama pakej yang sama):

    doktrin/dbal 4.0.4
  • buku doktrin/doktrin 2.12.0
Saya menemui beberapa tutorial untuk mengendalikan perkara ini tetapi ia tidak memuaskan:

    https://www.liip.ch/en/blog/doctrine-and-generated-columns Ini tidak berfungsi lagi kerana Doctrine DBAL mengalih keluar pengurus acara pada DBAL 4. (rujuk)
  • https://medium.com/yousign-engineering-product/ignore-custom-indexes-on-doctrine-dbal-b5131dd22071 Ini menunjukkan mesej penamatan Kunci konfigurasi "platform_service" ditamatkan sejak doctrin-bundle 2.9. DBAL 4 tidak akan menyokong tetapan platform tersuai melalui params sambungan lagi. (rujuk)
Saya menemui isu GitHub tentang penggantian konfigurasi platform_service di sini https://github.com/doctrine/DoctrineBundle/issues/1656.

Membaca 2 halaman ini memberi saya semua maklumat tentang cara menggunakan platform DBAL tersuai melalui perisian tengah Doktrin:

    https://github.com/doctrine/dbal/pull/5699
  • https://symfony.com/bundles/DoctrineBundle/current/middlewares.html
Akhirnya, selepas menggali kod sumber, saya menemui penyelesaiannya. Anda perlu mencipta 4 fail, 2 fail adalah mengenai perisian tengah Doktrin dan 2 fail lain adalah mengenai platform dan skema DBAL 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn