2012-02-16 12 views
12

Intento trabajar con dos administradores de entidades para el mismo paquete. Mi configuración es la siguiente:Trabajando con dos administradores de entidades en el mismo paquete en Symfony2

orm: 

    default_entity_manager: default 
    entity_managers: 
     electra: 
      connection:  electra 
      mappings: 
       XXDemoBundle: ~ 
     default: 
      connection:  default 
      mappings: 
       XXDemoBundle: ~ 

¿Hay alguna manera de saber ENTIDADES wich pertenecen a cada gestor de la entidad? Se bloquea ahora si quiero trabajar con una tabla que no pertenece al administrador de entidades predeterminado.

Gracias

  • ACTUALIZACIÓN

aquí está mi configuración para la conexión:

doctrine: 
    dbal: 
     default_connection:  default 
     connections: 
      default: 
       dbname:   old_project 
       user:    root 
       password:   123123 
       host:    1.1.1.1 
       port:    1 
      electra: 
       dbname:   electra 
       user:    root 
       password:   123123 
       host:    2.2.2.2 
       port:    2 

orm: 
    default_entity_manager: electra 
    entity_managers: 
     electra: 
      connection:  electra 
      mappings: 
       XXDemoBundle: ~ 


     default: 
      connection:  default 
      mappings: 
       XXDemoBundle: ~ 
+0

Por favor enviar un ejemplo sencillo de lo que se caiga. Ambas conexiones apuntan a la misma base de datos? Parece que también debería haber auto_generate_proxy_classes allí y tal vez auto_mapping, pero tal vez no. Pruebe "php app/console doctrine: mapping: info --em" con el primero y luego con el otro administrador de entidades. – Cerad

+0

¡Hola! Uso dos bases de datos diferentes con dos conexiones diferentes. El mapeo: la información dice que no tengo entidades manejadas por el administrador de entidades predeterminado, todas mis entidades son manejadas por electra. – gabrielthorn

+0

Eso significa que tienes un problema de configuración en alguna parte. Por favor, publique sus asignaciones de conexión. doctrine: mapping: info debe devolver la misma lista de entidades para ambos ems. Asegúrese de tener la línea auto_generate y de que está trabajando en modo de desarrollo. – Cerad

Respuesta

22

Para usar múltiples entitymanager en el mismo paquete, debe configurar las opciones de mapeo para cada entitymanager.

http://symfony.com/doc/current/reference/configuration/doctrine.html

Exemple de archivo de configuración

 
doctrine: 
    dbal: 
     default_connection: default 
     connections: 
      default: 
       driver: %database_driver% 
       host:  %database_host% 
       port:  %database_port% 
       dbname: %database_name% 
       user:  %database_user% 
       password: %database_password% 
       charset: UTF8 
      second: 
       driver: %database_sqlite_driver% 
       host:  ~ 
       port:  ~ 
       dbname: %database_sqlite_shop_name% 
       path:  %database_sqlite_shop_name% 
       user:  ~ 
       password: ~ 
       charset: UTF8 

    orm: 
     auto_generate_proxy_classes: %kernel.debug% 
     default_entity_manager: default 
     entity_managers: 
      default: 
       connection:  default 
       mappings: 
        YourBundle: 
         # you must specify the type 
         type:  "annotation"  
         # The directory for entity (relative to bundle path) 
         dir:  "Entity/FirstDb"   
         #the prefix 
         prefix: "Your\Bundle\Entity\FirstDb" 
      shop: 
       connection:  second 
       mappings: 
        YourBundle: 
         type: "annotation" 
         #here the second path where entity for the connection stand 
         dir: "Entity/SecondDb" 
         #the prefix 
         prefix: "Your\Bundle\Entity\SecondDb" 

Ahora puede utilizar la consola para gestionar su base de datos con el parámetro --em

Ex: base de datos de actualización para la tienda de EntityManager

php app/console doctrine:schema:update --em=shop 

Lea la información de asignación de Your \ Bundle \ En tidad \ SecondDb

Ex: base de datos de actualización para EntityManager predeterminado

php app/console doctrine:schema:update 

leer la información de mapeo de su \ Bundle \ Entidad \ FirstDb

+0

Gracias. Tu respuesta funcionó bien. ¡Debe ser aceptado! – Heyfara

+0

Gracias, y perdón por el último comentario. – gabrielthorn

+1

Dado que esta es una respuesta aceptada, tenga en cuenta que en la versión más reciente de Symfony debe escapar de las barras invertidas en el prefijo de esta manera: "Su \\ Bundle \\ Entity \\ SecondDb", de lo contrario, no funciona. – tomazahlin

2

bien. Intenté editar tu publicación original pero está esperando la revisión por parte de un compañero. No estoy seguro de cuánto tiempo lleva eso. Trate de cambiar su configuración para:

doctrine: 
    dbal: 
     default_connection:  default 
     connections: 

     default: 
      dbname:   old_project 
      user:    root 
      password:   123123 
      host:    1.1.1.1 
      port:    1 

     # Make an explicit connection just for clarity 
     old_project: 
      dbname:   old_project 
      user:    root 
      password:   123123 
      host:    1.1.1.1 
      port:    1    

     electra: 
      dbname:   electra 
      user:    root 
      password:   123123 
      host:    2.2.2.2 
      port:    2 

    orm: 
     # Humor me and add these 
     auto_generate_proxy_classes: %kernel.debug% 
    # auto_mapping: true 

    default_entity_manager: electra 
    entity_managers: 

    # Make an explicit old_project em so default does not confuse us 
    old_project: 
     connection:  old_project 
     mappings: 
      XXDemoBundle: ~ 

    electra: 
     connection:  electra 
     mappings: 
      XXDemoBundle: ~ 


    default: 
     connection:  default 
     mappings: 
      XXDemoBundle: ~ 

Ahora completamente soplar a la memoria caché sólo para estar seguro a continuación, ejecute:

php app/console doctrine:mapping:info --em electra 
php app/console doctrine:mapping:info --em old_project 

Debe obtener resultados idénticos. Probé esto en mi sistema, así que estoy bastante seguro de que si no lo hace, entonces tendrá algún error tipográfico en alguna parte.

Así que la información de asignación está funcionando. El siguiente paso es verificar que ambas bases de datos coincidan con el esquema de su entidad. Haga esto:

php app/console doctrine:schema:update --em electra --dump-sql 
php app/console doctrine:schema:update --em old_project --dump-sql 

Ninguno debe producir ninguna salida. Si lo hace, significa que su base de datos no coincide con sus entidades y que debe ser resuelta (posiblemente utilizando la opción --force) antes de que las consultas funcionen.

Una vez que las bases de datos están sincronizadas, probablemente debería usar doctrine: query: dql y hacer una consulta de prueba en contra de ambos gerentes. Luego regrese a su código.

=========================================

Se ahora se ha entendido que el objetivo real es que dos gerentes de entidades apunten al mismo conjunto de entidades, pero de alguna manera indican que cada administrador de entidades debe limitarse a un determinado conjunto de esas entidades. Y eso no es algo que el S2 soporte de manera inmediata.

Puede consultar el manual de Doctrine y ver cómo maneja los metadatos de entidad y quizás hacer algo con eso, pero eso podría complicarse.

Lo único que realmente ofrece S2 es la capacidad de vincular un administrador de entidades a todas las entidades en uno o más paquetes utilizando el atributo de asignación. Si quisiera compartir, digamos tres de las siete entidades de un paquete con otro paquete, simplemente recrearía esas entidades en el segundo paquete. Posiblemente extendiendo la clase para evitar la duplicación del código.

Creo que es posible que desee modificar un poco su enfoque. Si tiene un conjunto de entidades centrales compartidas con múltiples paquetes, colóquelas en su propio paquete. Cada paquete siguiente puede agregar entidades adicionales.

+0

Actualicé mi respuesta con una configuración nueva para probar – Cerad

+0

Ahora, la asignación parece correcta, veo las mismas entidades para los dos administradores de entidades. Sin embargo, obtengo el mismo error donde intento acceder a algo en electra, dice: SQLSTATE [42S22]: Columna no encontrada: 1054 Columna desconocida 't0.country_code' en 'lista de campo' 500 Error interno del servidor - PDOException la tabla de país está en electra db, no en la que tiene la conexión predeterminada – gabrielthorn

+0

Respuesta actualizada basada en el hecho de que ambos gerentes ven las mismas entidades. – Cerad

Cuestiones relacionadas