2012-02-16 10 views
12

Cerco di lavorare con due gestori di entità per lo stesso pacchetto. La mia configurazione è simile a:Lavorare con due gestori di entità nello stesso pacchetto in Symfony2

orm: 

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

C'è un modo per dire quali entit appartengono a quale gestore di entità? Crolla ora se voglio lavorare con una tabella che non appartiene al gestore di entità predefinito.

Grazie

  • UPDATE

qui è la mia configurazione per la connessione:

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

Si prega di inviare un semplice esempio di ciò che si blocca. Entrambe le tue connessioni puntano allo stesso database? Sembra che dovresti anche avere auto_generate_proxy_classes lì e forse auto_mapping ma forse no. Prova "php app/console doctrine: mapping: info --em" con il primo e poi l'altro gestore di entità. – Cerad

+0

Ciao! Uso due database diversi con due connessioni diverse. La mappatura: le informazioni dicono che non ho entità gestite dal gestore di entità predefinito, tutte le mie entità sono gestite da Elettra. – gabrielthorn

+0

Ciò significa che hai un problema di configurazione da qualche parte. Per favore pubblica i tuoi mapping delle connessioni. doctrine: mapping: info dovrebbe restituire lo stesso elenco di entità per entrambi gli em. Assicurati di avere la riga auto_generate e che stai lavorando in modalità sviluppo. – Cerad

risposta

22

Per utilizzare EntityManager multiplo in stesso fascio bisogna config opzioni di mapping per ogni EntityManager.

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

Esempio off file di configurazione

 
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" 

È ora possibile utilizzare la console per la gestione db con il parametro --em

Es: aggiornamento del database per il negozio EntityManager

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

Leggi informazioni di mappatura dal tuo \ Bundle \ En tity \ SecondDb

Es: aggiornamento del database per impostazione predefinita EntityManager

php app/console doctrine:schema:update 

informazioni Leggi la mappatura dal tuo \ Bundle \ Entity \ FirstDb

+0

Grazie. La tua risposta ha funzionato bene. Dovrebbe essere accettato! – Heyfara

+0

Grazie, e mi dispiace per il commento in ritardo. – gabrielthorn

+1

Poiché questa è una risposta accettata, si prega di fare attenzione che nella versione più recente di Symfony è necessario sfuggire alle barre inverse in questo modo: "Il tuo \\ Pacchetto \\ Entità \\ SecondDb", altrimenti non funziona. – tomazahlin

2

OK. Ho cercato di modificare il tuo post originale ma è in attesa di revisione da parte dei colleghi. Non sono sicuro di quanto ci vorrà. Provare a cambiare la vostra configurazione per:

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

Ora completamente soffiare via la cache solo per essere sicuri quindi eseguire:

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

Si dovrebbe ottenere risultati identici. Ho provato questo sul mio sistema quindi sono abbastanza certo che se non lo fai, hai qualche errore di battitura da qualche parte.

Quindi le informazioni di mappatura stanno funzionando. Il passo successivo è verificare che entrambi i database corrispondano allo schema dell'entità. Quindi, fare questo:

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

Né dovrebbe produrre alcuna uscita. Se lo fai, significa che il tuo database non corrisponde alle tue entità e che deve essere risolto (probabilmente usando l'opzione --force) prima che le query funzionino.

Una volta che i database sono in sincronia allora probabilmente si dovrebbe usare la dottrina: query: dql e fare una query di prova contro entrambi i manager. Quindi torna nel tuo codice.

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

E ' è stato ora compreso che il vero obiettivo è avere due gestori di entità che puntano allo stesso insieme di entità ma in qualche modo indicare che ciascun gestore di entità dovrebbe limitarsi a un certo insieme di tali entità. E questo non è qualcosa che il S2 supporta fuori dalla scatola.

Si potrebbe guardare attraverso il manuale di Dottrina e vedere come gestisce i metadati entità e magari fare qualcosa con quel ma che potrebbe complicarsi.

L'unica cosa che davvero S2 offre è la possibilità di associare un gestore di entità a tutti i soggetti in uno o più fasci che utilizzano l'attributo di mappatura. Se si desidera condividere affermare tre delle sette entità da un pacchetto con un altro pacchetto, sarà sufficiente ricreare tali entità nel secondo pacchetto. Probabilmente estendendo la classe in modo da evitare la duplicazione del codice.

Penso che potresti voler alterare il tuo approccio un po '. Se si dispone di un insieme di entità principali condivise con più gruppi, inserirli nel proprio pacchetto. Ciascun seguito sul pacchetto può quindi aggiungere ulteriori entità.

+0

Ho aggiornato la mia risposta con la nuova configurazione per provare – Cerad

+0

Ora la mappatura sembra soddisfacente, vedo le stesse entità per i due gestori di entità. Tuttavia, ottengo lo stesso errore ovunque cerco di accedere a qualcosa in electra, si dice: SQLSTATE [42S22]: colonna non trovata: 1054 colonna sconosciuta 't0.country_code' in 'lista campi' Errore interno server 500 - PDOException la tabella del paese è in db electra, non con quella con la connessione predefinita – gabrielthorn

+0

Risposta aggiornata basata sul fatto che entrambi i gestori vedono le stesse entità. – Cerad

Problemi correlati