„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Benutzerdefinierte Indizes für Doctrine DBAL 4 ignorieren

Benutzerdefinierte Indizes für Doctrine DBAL 4 ignorieren

Veröffentlicht am 31.07.2024
Durchsuche:295

Ignore custom indexes on Doctrine DBAL 4

Sie können Datenbankindizes mit dem Attribut #[ORM\Index(fields: ['fieldName']] in der Entitätsdatei erstellen und Doctrine erledigt den Rest, um den Index für Sie zu verwalten, aber Darüber werde ich nicht sprechen.

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 die Änderungen einfacher bereitgestellt oder rückgängig gemacht werden 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):

    doctrine/dbal 4.0.4
  • doctrine/doctrine-bundle 2.12.0
Ich habe mehrere Tutorials gefunden, die dieses Problem lösen, 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 ein GitHub-Problem zum Ersetzen der platform_service-Konfiguration gefunden: https://github.com/doctrine/DoctrineBundle/issues/1656.

Durch das Lesen dieser beiden Seiten habe ich alle Informationen darüber erhalten, wie man eine benutzerdefinierte DBAL-Plattform über die Doctrine-Middleware verwendet:

    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.

true, 'index_name_2' => wahr, ]; #[\Override] geschützte Funktion _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; } }
 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;
    }
}
Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/indragunawan/ignore-custom-indexes-on-doctrine-dbal-4-387j?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3