Heim > Backend-Entwicklung > PHP-Tutorial > Benutzerdefinierte Indizes für Doctrine DBAL 4 ignorieren

Benutzerdefinierte Indizes für Doctrine DBAL 4 ignorieren

王林
Freigeben: 2024-07-28 00:10:32
Original
489 Leute haben es durchsucht

Ignore custom indexes on Doctrine DBAL 4

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.

Lösung

Ich verwende diese Paketversionen. (Ich glaube, dass die Lösung mit derselben Hauptversion der Pakete funktionieren wird):

  • Doktrin/Dbal 4.0.4
  • Doktrin/Doktrin-Bundle 2.12.0

Ich habe mehrere Tutorials gefunden, um damit umzugehen, aber es ist nicht zufriedenstellend:

  • https://www.liip.ch/en/blog/doctrine-and-generated-columns Dies funktionierte nicht mehr, da Doctrine DBAL den Event-Manager auf DBAL 4 entfernt. (ref)
  • https://medium.com/yousign-engineering-product/ignore-custom-indexes-on-doctrine-dbal-b5131dd22071 Hier wurde eine veraltete Meldung angezeigt. Der Konfigurationsschlüssel „platform_service“ ist seit doctrine-bundle 2.9 veraltet. DBAL 4 unterstützt das Festlegen einer benutzerdefinierten Plattform über Verbindungsparameter nicht mehr. (ref)

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:

  • https://github.com/doctrine/dbal/pull/5699
  • https://symfony.com/bundles/DoctrineBundle/current/middlewares.html

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);
    }
}
Nach dem Login kopieren
<?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();
    }
}

Nach dem Login kopieren
<?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);
    }
}
Nach dem Login kopieren
<?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;
    }
}
Nach dem Login kopieren

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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage