2011-12-29 9 views
0

私はSymfony2 Frameworkに2つのバンドルを持っています: ユーザエンティティを持つ「MainBundle」とIssue Tracking System用のすべてのものを含む「TicketBundle」。このケースでは、エンティティ "プール"と "Mappingpooluser"だけが重要です。 私は2つの異なるデータベースを使用しなければならないので、両方とも異なるエンティティ・マネージャを使用します。Symfony2でEntity Managerをエンティティにバインドするには?

:今、私はMainBundleの1エンティティ(ユーザー)と1つのエンティティTicketBundleの(プール)(およびいくつかの重要でないもの)を必要とするエンティティ(Mappingpooluser)を持っている

doctrine: 
    dbal: 
    default_connection: default 
    connections: 
     default: 
       [driver, host etc.] 
       dbname: m_symfony 
     ticket: 
       [driver, host etc.] 
       dbname: m_ticketbundle 


orm: 
    default_entity_manager: default 
    entity_managers: 
    default: 
     connection: default 
     mappings: 
     XXXMainBundle: ~ 
    ticket: 
     connection: ticket 
     mappings: 
     XXXTicketBundle: ~ 
     XXXMainBundle: ~ 

(以下私のconfig.ymlを参照してください)この時点で、すべてティル

/** 
* XXX\TicketBundle\Entity\Mappingpooluser 
* 
* @ORM\Table(name="MappingPoolUser") 
* @ORM\Entity(repositoryClass="XXX\TicketBundle\Repository\MappingPoolUserRepository") 
*/ 
class Mappingpooluser 
{ 

/** 
* @var integer $poolid 
* 
* @ORM\OneToOne(targetEntity="Pool") 
* @ORM\JoinColumn(name="id", referencedColumnName="id") 
*/ 
private $pool; 

/** 
* @var integer $userid 
* 
* @ORM\OneToOne(targetEntity="XXX\MainBundle\Entity\User") 
* @ORM\JoinColumn(name="id", referencedColumnName="id") 
*/ 
private $user; 

[getter/setter and this stuff] 

が正常に動作します:) 私は$を呼び出すと、私は

$em = $this->getDoctrine()->getEntityManager("ticket"); 
$entities = $em->getRepository('XXXTicketBundle:Mappingpooluser')->findAll(); 

を介してコントローラにMappingpooluserエンティティを取得することができますエンティティ[0] - > getPoo私は$ entities [0] - > getUser() - > getId()を呼び出すと、プールの正しいIDを取得します(プールはMappingpooluserのような同じバンドルにあります)私はエラーを受け取ります:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'm_ticketbundle.User' doesn't exist 

これは、ユーザーテーブルが他のDB(m_symfony)にあるので、正しく終了します。

Long Story、short Question:Symfony2にプールのチケットエンティティマネージャーとユーザーのデフォルトエンティティマネージャーを使用させるにはどうすればよいですか?

答えて

3

シナリオの実際の問題は、同じエンティティ(プール)を2つの異なるエンティティマネージャ(デフォルトとチケット)にマッピングする必要があることです。私は、このシナリオに推薦することは、このエンティティのエンティティ層に階層を作成します

  • ベースプールを、すべての一般的なフィールドに
  • プール「デフォルト」が含まれ、デフォルトのEM
  • プールのための専門分野が含まれていますチケットの特殊フィールドが含まれています

次に、それらを異なるエンティティマネージャにマップすることができます。パスは、バンドルのルートディレクトリからの相対である

mappings: 
    MyBundle: 
    type: annotation 
    dir: Path/To/Entities 

:デフォルト、チケットエンティティのための2つの異なる名前空間を使用する場合は、マッピングが、このようなあなたのEM構成にロードする必要があり、そこからフォルダを指定することができます。たとえば、Entity/DefaultとEntity/Ticketの名前空間を持ち、Entity名前空間のマッピングされていないクラスに共通のフィールドを持ちながら、それらを独立してマップすることができます。

+0

ありがとう、完璧に動作します。私の一日を保存:) –

関連する問題