2017-02-02 16 views
1

symfony3アプリケーションで2つの異なるデータベースを使用するように設定しました。彼らはかなり類似している、テーブルの構造は同じであり、したがってフィールドです。問題は、たとえば、db1の記事テーブルはdb1_articleと呼ばれ、db2の記事テーブルはdb2_articleです。それらは異なるデータを有するが、同じ構造を有する。今symfony2-doctrineでテーブルプレフィックスをプログラムで変更する方法

、私はそのような記事のためのエンティティを設定しています:

/** 
* @ORM\Entity 
* @ORM\Table(name="db1_article") 
*/ 
class Article { 
... 
} 

私はdinamicallyどこかのテーブル名を定義することができ、DB2に同じテーブルに対して異なるエンティティを作成するために希望されません重複を避けるために?

おかげで、あなたはそのエンティティの教義のクラスのメタデータを更新するために持ってテーブルを変更するために

+0

私はそれが可能ではないと思います。 Doctrineは '$ em-> persist($ article)'を呼び出す際にどのテーブル名を使うべきかを知ることができましたか? –

+0

私はおそらく、注釈にテーブル名を指定する方法があると思いますか? – user3174311

+1

2つのエンティティマネージャhttp://symfony.com/doc/current/doctrine/multiple_entity_managers.htmlをそれぞれ異なるマッピングファイルセットで使用できます。アノテーションは機能しません。すべてのマッピングデータを保存する教義メタクラスと呼ばれるものもあります。詳細は分かりませんがテーブル名を変更することは可能だと思います。 Doctrineのドキュメントでちょっと覗いてみてください。 – Cerad

答えて

2

// getEntityManager() = $this->getDoctrine()->getManager() 
$articleMetaData = $this->getEntityManager()->getMetadataFactory()->getMetadataFor(Article::class); 
$metaDataBuilder = new ClassMetadataBuilder($articleMetaData); 
$metaDataBuilder->setTable('db2_article'); 
$this->getEntityManager()->getMetadataFactory() 
    ->setMetadataFor(Article::class, $metaDataBuilder->getClassMetadata()); 

$article2MetaData = $this->getEntityManager()->getClassMetadata(Article::class); 
$article2MetaData->getTableName(); // is now db2_article 
$this->getEntityManager()->find(Article::class, 1); // will query db2_article ID -> 1 

参照、クラスのメタデータは方法のように、最大​​何であるかを確認するには:Doctrine PHP Mapping

+0

コントローラからではなく、モデルから機能させようとしていても、この作品に感謝します。ありがとう。 – user3174311

0

あなたが同じを使用することができますので、私は、データベースごとに異なるエンティティマネージャを使用してのアプローチのために行くだろうエンティティ。

//config.yml 
doctrine: 
    dbal: 
     default_connection: first_entity_manager 
     connections: 
      first_entity_manager: 
       driver: %database_driver% 
       host:  %database_host% 
       port:  %database_port% 
       dbname: %database_name% 
       user:  %database_user% 
       password: %database_password% 
       charset: UTF8 
      second_entity_manager: 
       driver: %database_2nd_driver% 
       host:  %database_2nd_host% 
       port:  %database_2nd_port% 
       dbname: %database_2nd_name% 
       user:  %database_2nd_user% 
       password: %database_2nd_password% 
       charset: UTF8 
    orm: 
     default_entity_manager: first_entity_manager 
     entity_managers: 
      first_entity_manager: 
       connection:  first_entity_manager 
       mappings: 
        AppBundle: ~ 
      second_entity_manager: 
       connection:  second_entity_manager 
       mappings: 
        AppBundle: ~ 

それからちょうど私はかなり古いが、まだ How to setup table prefix in symfony2 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/sql-table-prefixes.html

を働くテーブルsuscriber

を使用することになり、正しいエンティティマネージャにテーブルプレフィックスの

$em_first = $this->getDoctrine()->getManager('first_entity_manager'); 
$em_second = $this->getDoctrine()->getManager('second_entity_manager'); 

$article_first_em = $em_first->getRepository('AppBundle:Article')->find(1); 
$article_second_em = $em_second->getRepository('AppBundle:Article')->find(2); 

を使用するためにいくつかの機能をプログラミング

関連する問題