"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Ignorer les index personnalisés sur Doctrine DBAL 4

Ignorer les index personnalisés sur Doctrine DBAL 4

Publié le 2024-07-31
Parcourir:498

Ignore custom indexes on Doctrine DBAL 4

Vous pouvez créer des index de base de données en utilisant l'attribut #[ORM\Index(fields: ['fieldName'] sur le fichier d'entité et Doctrine fera le reste pour gérer l'index pour vous, mais Je ne parlerai pas de ça

À mesure que votre projet se développe ou nécessite des exigences spécifiques, vous devrez peut-être utiliser des types d'index personnalisés tels que GIST, GIN, BRIN, etc. (https://www.postgresql.org/docs/current/indexes-types.html). Doctrine ne prend pas en charge la création prête à l'emploi de types d'index spécifiques au fournisseur de base de données (réf).

Pour résoudre ce problème, vous pouvez soit exécuter le DDL CREATE INDEX directement dans la base de données, soit écrire le DDL sur le fichier doctrine-migrations. Cette dernière option vous offre l'avantage de faciliter le déploiement ou l'annulation des modifications.

Quelle que soit la méthode que vous utilisez pour créer l'index personnalisé, Doctrine marquera toujours ces index personnalisés comme index non mappés. Par conséquent, si vous exécutez doctrine:schema:validate, vous obtiendrez une erreur indiquant que si votre base de données n'est pas synchronisée, le de même lors de l'exécution de doctrine:schema:update --dump-sql ou doctrine:migrations:diff, il vous montrera l'instruction DROP INDEX ... pour supprimer les index personnalisés.

Solution

J'utilise ces versions de package. (Je pense que la solution fonctionnera sur la même version majeure des packages) :

  • doctrine/dbal 4.0.4
  • doctrine/doctrine-bundle 2.12.0

J'ai trouvé plusieurs tutoriels pour gérer cela mais ce n'est pas satisfaisant :

  • https://www.liip.ch/en/blog/doctrine-and-generated-columns Cela ne fonctionnait plus car Doctrine DBAL supprime le gestionnaire d'événements sur DBAL 4. (ref)
  • https://medium.com/yousign-engineering-product/ignore-custom-indexes-on-doctrine-dbal-b5131dd22071 Cela affichait un message de dépréciation. La clé de configuration "platform_service" est obsolète depuis doctrine-bundle 2.9. DBAL 4 ne prendra plus en charge la définition d'une plate-forme personnalisée via les paramètres de connexion. (réf)

J'ai trouvé un problème GitHub concernant le remplacement de la configuration platform_service ici https://github.com/doctrine/DoctrineBundle/issues/1656.

La lecture de ces 2 pages m'a donné toutes les informations sur la façon d'utiliser une plateforme DBAL personnalisée via le middleware Doctrine :

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

Enfin, après avoir fouillé dans le code source, j'ai trouvé la solution. Vous devez créer 4 fichiers, 2 fichiers concernent le middleware Doctrine et 2 autres fichiers concernent la plate-forme et le schéma Doctrine DBAL.

Modifiez l'espace de noms et le nom de la classe selon vos besoins.



















 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;
    }
}
Déclaration de sortie Cet article est reproduit sur : https://dev.to/indragunawan/ignore-custom-indexes-on-doctrine-dbal-4-387j?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3