2012-07-02 18 views
13

Mam projekt Symfony2 z db MySQL:Doctrine 2 - konfiguracja wielu baz danych i używać

#app/config/config.yml 
doctrine: 
    dbal: 
     driver: %database_driver% # < 
     host:  %database_host%  # | 
     port:  %database_port%  # | Defined in 
     dbname: %database_name%  # | parameters.ini 
     user:  %database_user%  # | 
     password: %database_password% # < 

    orm: 
     auto_generate_proxy_classes: %kernel.debug% 
     auto_mapping: true 

Teraz chciałbym zrobić prostych zapytań (jak rutynowe połączenia) do innej bazy danych.

Czy powinienem zdefiniować inny dbal w pliku konfiguracyjnym?
Jeśli tak, w jaki sposób można go skonfigurować, zachowując domyślne połączenie dla projektu?
Czy muszę skonfigurować urządzenie dla każdego połączenia?

Odpowiedz

22

Trzeba dodać kolejny poziom konfiguracji, a także korzystać z multiple entity managers jako doktryna używa menedżera 1 jednostki za połączenia z bazą danych .. konfiguracja może wyglądać mniej więcej tak:

doctrine: 
    dbal: 
     connections: 
     default: 
      driver: %database_driver% # < 
      host:  %database_host%  # | 
      port:  %database_port%  # | Defined in 
      dbname: %database_name%  # | parameters.ini 
      user:  %database_user%  # | 
      password: %database_password% # < 
     another: 
      driver: %database2_driver% # < 
      host:  %database2_host%  # | 
      port:  %database2_port%  # | Defined in 
      dbname: %database2_name%  # | parameters.ini 
      user:  %database2_user%  # | 
      password: %database2_password% # < 

Następnie należy zdefiniować jako podmiot wielu menedżerów tak

doctrine: 
    orm: 
     default_entity_manager: default 
     entity_managers: 
      default: 
       connection:  default 
       mappings: 
        AcmeDemoBundle: ~ 
        AcmeStoreBundle: ~ 
      another: 
       connection:  another 
       mappings: 
        AcmeCustomerBundle: ~ 

następnie w swoim działaniu można użyć następujących czynności, aby uzyskać prawidłowy kierownika jednostki:

$em = $this->get('doctrine')->getEntityManager('default'); 
$em = $this->get('doctrine')->getEntityManager('another'); 

zależnie od tego, którego menedżera encji potrzebujesz

+0

Dokładnie tego, czego szukałem. Czy muszę zdefiniować menedżera encji dla każdego połączenia? Będę tylko wywoływał procedury z innego połączenia. –

+0

Potrzebujesz menedżera encji na połączenie tak ... jeśli nie zamierzasz go użyć, dlaczego konfigurujesz połączenie? – ManseUK

+0

W rzeczywistości przed moim "innym" połączeniem używałem 'auto_mapping: true' i nie potrzebuję zarządzać jakimkolwiek bytem z połączenia' another'. Przypuszczam, że będę musiał użyć '$ this-> get ('doctrine.dbal.another_connection')' i zachować 'entity_managers' empty –