Resuelve el error ORM de Doctrine con tablas sin clave principal en MySQL al mapear la base de datos.

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn

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

arameters:
    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

Más...

Nueva web Laboratorios Valquer

En colaboración con Amvos, hemos realizado la nueva web de laboratorios Valquer. Es una empresa fundada en 1975, con presencia en más

Nueva web credithousecar.com

Ha sido un placer realizar todo el diseño y la imagen corporativa de credithousecar.com Una web moderna y actual, con un diseño

Más...

Nueva web Laboratorios Valquer

En colaboración con Amvos, hemos realizado la nueva web de laboratorios Valquer. Es una empresa fundada en 1975, con presencia en más

Nueva web credithousecar.com

Ha sido un placer realizar todo el diseño y la imagen corporativa de credithousecar.com Una web moderna y actual, con un diseño

Deja un comentario