2012-02-16 54 views
12

我嘗試與兩個實體管理器一起使用同一捆綁包。我的配置是這樣的:在Symfony2的同一捆綁包中使用兩個實體管理器

orm: 

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

有什麼辦法可以告訴哪些entites屬於哪個實體管理器?如果我想使用一個不屬於默認實體管理器的表,它現在會崩潰。

感謝

  • UPDATE

這裏是我的連接配置:

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

請張貼什麼是崩潰的一個簡單的例子。你的兩個連接都指向同一個數據庫?看起來你應該也有auto_generate_proxy_classes在那裏,也許auto_mapping,但可能不會。先嚐試「php app/console doctrine:mapping:info --em」,然後使用其他實體管理器。 – Cerad 2012-02-16 13:56:03

+0

嗨!我用兩個不同的連接使用兩個不同的數據庫。映射:info表示我沒有實體由默認實體管理器處理,我的所有實體都由electra處理。 – gabrielthorn 2012-02-16 14:13:25

+0

這意味着你有一個配置問題的地方。請發佈您的連接映射。 doctrine:mapping:info應該返回兩個ems的相同實體列表。確保你有auto_generate行,並且你正在開發模式下工作。 – Cerad 2012-02-16 16:17:22

回答

22

要在同一個包中使用多個entitymanager,您必須爲每個entitymanager配置映射選項。

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

爲例關閉配置文件

 
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" 

您現在可以使用控制檯與--em參數

防爆管理你的數據庫:對於店鋪的EntityManager更新數據庫

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

從您的\ Bundle \ En中讀取映射信息tity \ SecondDb

例:默認的EntityManager從

php app/console doctrine:schema:update 

讀取映射信息更新數據庫,你\包\實體\ FirstDb

+0

謝謝。你的答案工作得很好。它應該被接受! – Heyfara 2015-07-09 13:22:30

+0

謝謝,並對已故的意見感到抱歉。 – gabrielthorn 2015-11-05 15:13:00

+1

由於這是一個被接受的答案,請注意,在Symfony的新版本中,你必須在前綴中使用反斜槓,如「Your \\ Bundle \\ Entity \\ SecondDb」,否則它不起作用。 – tomazahlin 2016-06-01 17:03:27

2

確定。試圖編輯您的原始帖子,但它正在等待同行評審。不知道需要多長時間。試着改變你的配置到:

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

現在完全吹走緩存只是要確定然後運行:

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

你應該得到相同的結果。我在我的系統上測試了這一點,所以我相當肯定,如果你不這樣做,那麼你在某個地方會出現一些錯字。

因此,映射信息正在工作。下一步是驗證兩個數據庫是否匹配您的實體模式。所以這樣做:

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

都不應該產生任何輸出。如果有人這樣做,這意味着你的數據庫不匹配你的實體,並且需要解決(可能使用--force選項),然後再進行查詢。

一旦數據庫同步,那麼你應該使用doctrine:query:dql並對兩個管理器做一個測試查詢。然後回到你的代碼。

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

它現在已經被理解爲真正的目標是讓兩個實體經理指向相同的一組實體,但是某種程度上表明每個實體經理應該將自己限制在一組這樣的實體中。這不是S2開箱即用的東西。

你可以查看Doctrine手冊,看看它如何處理實體元數據,也許做些什麼,但可能會變得複雜。

S2真正提供的唯一事情是能夠使用映射屬性將實體管理器綁定到一個或多個包中的所有實體。如果你想分享一個包中的七個實體中的三個與另一個包,那麼你只需在第二個包中重新創建這些實體。可能通過擴展這個類來避免代碼重複。

我想你可能想改變你的方法一下。如果你有一組核心實體與多個bundle共享,那麼把它們放在他們自己的bundle中。隨後的每個捆綁可以添加額外的實體。

+0

用新配置更新了我的答案以嘗試 – Cerad 2012-02-16 19:25:33

+0

現在,映射看起來很好,我看到了兩個實體管理器的相同實體。但是,無論我嘗試訪問electra中的某處,我都會遇到同樣的錯誤,它會顯示: SQLSTATE [42S22]:列未找到:1054'字段列表'中的未知列't0.country_code' 500內部服務器錯誤 - PDOException 國家表在electra分貝,不與默認連接 – gabrielthorn 2012-02-16 19:52:44

+0

更新的答案基於這一事實,即管理員看到相同的實體。 – Cerad 2012-02-16 20:23:12

相關問題