es Spanish

Resuelve el error ORM de Doctrine con MySQL

Share on facebook
Share on linkedin
Share on twitter
Share on email

Te presentamos una solución para resolver el error ORM de Doctrine con tablas sin clave principal en MySQL al mapear la base de datos.

Symfony 3.4

En el proyecto trabajo con una base de datos y además tengo que conectar con otras dos bases de datos.

Con lo que el config.yml lo tengo de la siguiente manera:

# Doctrine Configuration
doctrine:
    dbal:
        default_connection: bbdd
        connections:
            bbdd:
                driver: pdo_mysql
                host: '%database_host%'
                port: '%database_port%'
                dbname: '%database_name%'
                user: '%database_user%'
                password: '%database_password%'
                charset: UTF8
            bbdd2:
                driver: pdo_mysql
                host: '%database_hostp%'
                port: '%database_portp%'
                dbname: '%database_namep%'
                user: '%database_userp%'
                password: '%database_passwordp%'
                charset: UTF8
            bbdd3:
                driver: pdo_mysql
                host: '%database_hostg%'
                port: '%database_portg%'
                dbname: '%database_nameg%'
                user: '%database_userg%'
                password: '%database_passwordg%'
                charset: UTF8
    orm:
        default_entity_manager: bbdd
        entity_managers:
            bbdd:
                connection: bbdd
                mappings:
                    AppBundle: ~
            bbdd2:
                connection: bbdd2
                mappings:
                    AppBundle: ~
        # auto_generate_proxy_classes: '%kernel.debug%'
        # naming_strategy: doctrine.orm.naming_strategy.underscore
        # auto_mapping: true

 

Y definidos los parámetros de conexión en parameters.yml

parameters:
    database_host: localhost
    database_port: 3306
    database_name: bbdd1
    database_user: bddd1
    database_password: pass1
    
    database_hostp: host.es
    database_portp: 3306
    database_namep: bbdd2
    database_userp: bbdd2
    database_passwordp: pass2
    
    database_hostg: localhost
    database_portg: 3306
    database_nameg: bbdd3
    database_userg: bbdd3
    database_passwordg: pass3

 

Doctrine, tablas sin clave principal en MySQL

Table ____ has no primary key. Doctrine does not support reverse engineering from tables that don’t have a primary key.

Asi que Doctrine no puede funcionar en tablas que no tienen clave principal. En MySQL, crear tablas sin PK siempre es una mala idea, pero, en algunos casos (o sistemas heredados) que no tienen PK en algunas tablas, aún puede usar Doctrine como ORM.

Sin embargo, de forma predeterminada (y creo que esto no cambiará) si su base de datos tiene tablas sin asignación de clave primaria simplemente no funcionará = /.

La forma más rápida de resolver esto es anular la clase de proveedor DatabaseDriver, en el espacio de nombres:

namespace Doctrine\ORM\Mapping\Driver

 

Editar el archivo vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php

 

// línea 287

// dejar el código como sigue:

if ( ! $table->hasPrimaryKey()) {
    //throw new MappingException(
    // "Table " . $table->getName() . " has no primary key. Doctrine does not ".
    // "support reverse engineering from tables that don't have a primary key."
    //);
}else{
    $pkColumns = $table->getPrimaryKey()->getColumns();
}

// línea 508
public function getTablePrimaryKeys(Table $table)

{
    // comentar todo y dejar lo siguiente:
    if( $table->hasPrimaryKey() ) //add this if to avoid fatalError
        return $table->getPrimaryKey()->getColumns();
}

 

Entonces podemos ejecutar:

$ php bin/console doctrine:mapping:convert annotation --em bbdd2 ./src/AppBundle/Resources/config/doctrine/metadata/orm --from-database --force

Una vez hecho, volvemos a dejar el archivo DatabaseDriver.php como estaba.

 

Fuente

Si te ha servido, deja un comentario

Una respuesta

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Más entradas

marketing digital Alicante
Marketing Web

Marketing digital en Alicante

¿Estás pensando en contratar a una empresa especializada en marketing digital para tu negocio en Alicante? Te contamos todas las claves y ventajas del sistema

Categorías

¿Quieres impulsar tu negocio?

escríbenos y manténte en contacto

Desarrollo de tiendas online Garber Informática

Contacta con nosotros