2012-07-02 5 views
13

У меня есть проект Symfony2 с БД MySQL:Doctrine 2 - конфигурация нескольких баз данных и использовать

#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 

Теперь я хотел бы сделать простые запросы (например, обычных вызовов) к другой базе данных.

Должен ли я определить другой dbal в файле конфигурации?
Если да, то как его можно настроить при сохранении соединения по умолчанию для проекта?
Должен ли я настраивать orm для каждого соединения?

ответ

22

Вам нужно добавить еще один уровень конфигурации, а также использовать в качестве multiple entity managers Доктрина использует менеджер 1 лица за подключение к базе данных .. конфигурация может выглядеть следующим образом:

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% # < 

Затем вы определяете несколько менеджеров сущностей, как так

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

затем в своем действии вы можете использовать следующие, чтобы получить правильный менеджер лица:

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

в зависимости от того, какой администратор организации вам нужен

+0

Именно то, что я искал. Должен ли я определять диспетчер объектов для каждого соединения? Я буду вызывать только процедуры из другого соединения. –

+0

Вам нужен диспетчер объектов для каждого подключения. Да ... если вы не собираетесь его использовать, почему вы настраиваете соединение? – ManseUK

+0

Фактически перед моим «другим» соединением я использовал «auto_mapping: true», и мне не нужно управлять какой-либо сущностью из «другого» соединения. Полагаю, мне придется использовать '$ this-> get ('doctrine.dbal.another_connection')' и оставить 'entity_managers 'пустым –