2012-02-16 8 views
12

同じバンドルの2つのエンティティマネージャを使って作業しようとしています。Symfony2の同じバンドル内の2つのエンティティマネージャを使って作業する

orm: 

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

は、エンティティマネージャどの属するウィッヒのentitesを伝えるためにどのような方法があります:私の構成はこのようなものですか?既定のエンティティマネージャに属していないテーブルで作業したい場合、クラッシュするようになりました。

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

+0

こんにちは! 2つの異なる接続を持つ2つの異なるデータベースを使用します。マッピング:infoには、既定のエンティティマネージャによって処理されるエンティティがなく、すべてのエンティティがelectraによって処理されることが示されています。 – gabrielthorn

+0

これは、設定の問題がどこかにあることを意味します。接続マッピングを投稿してください。 doctrine:mapping:infoは両方のemのエンティティの同じリストを返さなければなりません。 auto_generate行があり、開発モードで作業していることを確認してください。 – Cerad

答えて

22

同じバンドルで複数のentitymanagerを使用するには、各entitymanagerのマッピングオプションを設定する必要があります。

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

Exempleオフ設定ファイル

 
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パラメータ

例を使用してDBを管理するためのコンソールを使用することができますショップのEntityManagerの更新データベース

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

あなたの\ Bundle \ Enからマッピング情報を読み取るtity \ SecondDb

は、ex:デフォルトのEntityManagerの更新データベース

php app/console doctrine:schema:update 

あなたの\バンドル\エンティティ\ FirstDb

+0

ありがとうございます。あなたの答えはうまくいった。それは受け入れられるべきです! – Heyfara

+0

ありがとう、遅いコメントを申し訳ありません。 – gabrielthorn

+1

これは受け入れられた答えなので、新しいバージョンのSymfonyでは "Your \\ Bundle \\ Entity \\ SecondDb"のようにプレフィックスのバックスラッシュをエスケープする必要があります。それ以外の場合は動作しません。 – tomazahlin

2

OK:ここ

おかげ

  • UPDATE

は、接続のための私の構成です。オリジナルの投稿を編集しようとしましたが、ピアレビューを待っています。それがどれくらい時間がかかるかはわかりません。あなたの設定を変更してみてください:

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を使用して、両方のマネージャに対してテストクエリを実行する必要があります。次にコードに戻ります。

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

それを実際の目標は、2つのエンティティ・マネージャに同じエンティティのセットを指し示すことであるが、各エンティティ・マネージャがそれらのエンティティの特定のセットに限定されるべきであることを何とか示していることが理解されている。それがS2がサポートするものではありません。

Doctrineのマニュアルを見て、それがエンティティメタデータをどのように処理しているかを見て、それを使って何かをすることもできますが、複雑になる可能性があります。

S2が実際に提供するのは、マッピング属性を使用して1つまたは複数のバンドル内のすべてのエンティティにエンティティマネージャをバインドする機能だけです。あるバンドルの7つのエンティティのうちの3つを別のバンドルと共有したい場合は、単にそのバンドルのエンティティを再作成します。コードの重複を避けるためにクラスを拡張することによって可能性があります。

あなたのアプローチを少し変更したいと思うかもしれません。コアエンティティのセットが複数のバンドルと共有されている場合は、それらを独自のバンドルに入れます。バンドル上のそれぞれのフォローは、追加のエンティティを追加できます。

+0

私の答えが新しい設定で – Cerad

+0

に更新されました。マッピングがうまくいくように見えますが、2つのエンティティマネージャに同じエンティティが表示されます。しかし、私は電車内で何かにアクセスしようとすると、同じエラーが発生します。 SQLSTATE [42S22]:列が見つかりません:1054 'フィールドリスト'の 't0.country_code'列が不明 500内部サーバーエラー - PDOException countryテーブルはelectra dbにあり、デフォルトの接続ではありません – gabrielthorn

+0

両方のマネージャーが同じエンティティを参照するという事実に基づいて答えが更新されました。 – Cerad

関連する問題