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.
Una respuesta