2012-07-02 8 views
13

tôi có một dự án Symfony2 với một db MySQL:thuyết 2 - cấu hình Nhiều cơ sở dữ liệu và sử dụng

#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 

Bây giờ tôi muốn làm cho truy vấn đơn giản (như các cuộc gọi thông thường) đến một cơ sở dữ liệu khác.

Tôi có nên định nghĩa một từ khác vào tệp cấu hình không?
Nếu có, làm thế nào nó có thể được cấu hình trong khi vẫn giữ kết nối mặc định cho dự án?
Tôi có phải định cấu hình một orm cho mỗi kết nối không?

Trả lời

22

Bạn cần thêm một mức độ cấu hình và cũng sử dụng multiple entity managers như Học thuyết sử dụng quản lý 1 đơn vị cho mỗi kết nối cơ sở dữ liệu .. cấu hình của bạn có thể trông như thế này:

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

Sau đó, bạn xác định nhiều nhà quản lý thực thể của bạn như nên

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

sau đó trong hành động của bạn, bạn có thể sử dụng sau đây để có được người quản lý thực thể chính xác:

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

tùy thuộc vào người quản lý thực thể bạn yêu cầu

+0

Chính xác những gì tôi đang tìm kiếm. BTW tôi phải xác định một người quản lý thực thể cho mỗi kết nối? Tôi sẽ chỉ gọi các thói quen từ kết nối khác. –

+0

Bạn cần một người quản lý thực thể cho mỗi kết nối có ... nếu bạn sẽ không sử dụng nó tại sao bạn thiết lập kết nối? – ManseUK

+0

Trong thực tế trước khi kết nối 'khác' của tôi, tôi đã sử dụng' auto_mapping: true' và tôi không cần quản lý bất kỳ thực thể nào từ kết nối 'another' khác. Tôi cho rằng tôi sẽ phải sử dụng '$ this-> get ('doctrine.dbal.another_connection')' và giữ 'entity_managers' trống rỗng –