"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Ignorar índices customizados no Doctrine DBAL 4

Ignorar índices customizados no Doctrine DBAL 4

Publicado em 31/07/2024
Navegar:418

Ignore custom indexes on Doctrine DBAL 4

Você pode criar índices de banco de dados usando o atributo #[ORM\Index(fields: ['fieldName'] no arquivo de entidade e o Doctrine fará o resto para gerenciar o índice para você, mas Não vou falar sobre isso.

À medida que seu projeto cresce ou requer requisitos específicos, pode ser necessário usar tipos de índice personalizados como GIST, GIN, BRIN, etc (https://www.postgresql.org/docs/current/indexes-types.html). O Doctrine não suporta a criação de tipos de índice específicos do fornecedor de banco de dados prontos para uso (ref).

Para resolver esse problema, você pode executar o CREATE INDEX DDL diretamente no banco de dados ou gravar o DDL no arquivo de migração de doutrina. A última opção oferece a vantagem de ser mais fácil implantar ou reverter as alterações.

Não importa qual método você use para criar o índice personalizado, o Doctrine sempre marcará esses índices personalizados como índices não mapeados, portanto, se você executar doutrina:schema:validate você receberá um erro informando que se seu banco de dados não estiver sincronizado, o mesmo ao executar doutrina:schema:update --dump-sql ou doutrina:migrations:diff ele mostrará a instrução DROP INDEX ... para remover os índices personalizados.

Solução

Estou usando essas versões de pacote. (Acredito que a solução funcionará na mesma versão principal dos pacotes):

    doutrina/dbal 4.0.4
  • doctrine/doctrine-bundle 2.12.0
Encontrei vários tutoriais para lidar com isso, mas não é satisfatório:

    https://www.liip.ch/en/blog/doctrine-and-generated-columns Isso não estava mais funcionando porque o Doctrine DBAL remove o gerenciador de eventos no DBAL 4. (ref)
  • https://medium.com/yousign-engineering-product/ignore-custom-indexes-on-doctrine-dbal-b5131dd22071 Isso estava mostrando uma mensagem de descontinuação A chave de configuração "platform_service" está obsoleta desde o pacote de doutrina 2.9. DBAL 4 não suportará mais a configuração de uma plataforma personalizada por meio de parâmetros de conexão. (ref)
Encontrei um problema no GitHub sobre a substituição da configuração do platform_service aqui https://github.com/doctrine/DoctrineBundle/issues/1656.

A leitura dessas 2 páginas me deu todas as informações sobre como usar uma plataforma DBAL customizada por meio do middleware Doctrine:

    https://github.com/doctrin/dbal/pull/5699
  • https://symfony.com/bundles/DoctrineBundle/current/middlewares.html
Finalmente, depois de me aprofundar no código-fonte, encontrei a solução. Você precisa criar 4 arquivos, 2 arquivos são sobre o middleware Doctrine e 2 outros arquivos são sobre a plataforma e esquema Doctrine DBAL.

Modifique o namespace e o nome da classe conforme sua necessidade.



















          
 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;
    }
}
Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/indragunawan/ignore-custom-indexes-on-doctrine-dbal-4-387j?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3