"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Ignorar índices personalizados en Doctrine DBAL 4

Ignorar índices personalizados en Doctrine DBAL 4

Publicado el 2024-07-31
Navegar:590

Ignore custom indexes on Doctrine DBAL 4

Puedes crear índices de bases de datos usando el atributo #[ORM\Index(fields: ['fieldName'] en el archivo de entidad y Doctrine hará el resto para administrar el índice por ti, pero No hablaré de eso

A medida que su proyecto crece o requiere requisitos específicos, es posible que necesite utilizar tipos de índice personalizados como GIST, GIN, BRIN, etc. (https://www.postgresql.org/docs/current/indexes-types.html). Doctrine no admite la creación de tipos de índices específicos del proveedor de bases de datos listos para usar (ref).

Para abordar este problema, puede ejecutar CREATE INDEX DDL directamente en la base de datos o escribir el DDL en el archivo de doctrina-migración. La última opción le brinda la ventaja de que es más fácil implementar o revertir los cambios.

No importa qué método utilice para crear el índice personalizado, Doctrine siempre marcará esos índices personalizados como índices no asignados, por lo tanto, si ejecuta Doctrine:schema:validate, obtendrá un error que indica que si su base de datos no está sincronizada, el Lo mismo al ejecutar doctrina: esquema: actualización --dump-sql o doctrina: migraciones: diff le mostrará la instrucción DROP INDEX ... para eliminar los índices personalizados.

Solución

Estoy usando estas versiones de paquetes. (Creo que la solución funcionará en la misma versión principal de los paquetes):

  • doctrina/dbal 4.0.4
  • doctrina/paquete-doctrina 2.12.0

Encontré varios tutoriales para manejar esto pero no me satisfacen:

  • https://www.liip.ch/en/blog/doctrine-and-generated-columns Esto ya no funcionaba porque Doctrine DBAL elimina el administrador de eventos en DBAL 4. (ref)
  • https://medium.com/yousign-engineering-product/ignore-custom-indexes-on-doctrine-dbal-b5131dd22071 Esto mostraba un mensaje de obsolescencia. La clave de configuración "platform_service" está obsoleta desde Doctrine-bundle 2.9. DBAL 4 ya no admitirá la configuración de una plataforma personalizada mediante parámetros de conexión. (árbitro)

Encontré un problema de GitHub sobre el reemplazo de la configuración de platform_service aquí https://github.com/doctrine/DoctrineBundle/issues/1656.

La lectura de estas 2 páginas me brindó toda la información sobre cómo usar una plataforma DBAL personalizada a través del middleware Doctrine:

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

Finalmente, después de profundizar en el código fuente, encontré la solución. Debe crear 4 archivos, 2 archivos son sobre el middleware Doctrine y otros 2 archivos son sobre la plataforma y el esquema Doctrine DBAL.

Modifique el espacio de nombres y el nombre de la clase según sus necesidades.



















 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;
    }
}
Declaración de liberación Este artículo se reproduce en: https://dev.to/indragunawan/ignore-custom-indexes-on-doctrine-dbal-4-387j?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3