7

ManyToOneとBの関係を持つエンティティAがありますが、AとBは同じDBスキーマに属していません。

エンティティ「A」はMyBundleバンドルに属し、エンティティ「B」はMyOtherBundleバンドルに属します。

公式ドキュメントでは、さまざまな接続を操作する方法について説明しています。複数のスキーマ=複数のエンティティマネージャー。しかし、私の場合は、両方のエンティティに参加したいと思います。

することによって:

$this->objEm->getRepository('MyBundle:MyEntity')->find($id);

また

$this->objEm->getRepository('MyBundle:MyEntity')->getMyResult($id);

私は自分のリポジトリの1つだけを呼び出しますが、config.ymlでは1つの接続しか選択できないため、彼はもう1つを取得できないと思います。

doctrine:
  dbal:
   connections:
     connection1:
       driver:   "%database_driver%"
       host:     "%database_host%"
       port:     "%database_port%"
       dbname:   "%database_name%"
       user:     "%database_schema1_user%"
       password: "%database_schema1_password%"
       service:  "%database_service%"
       charset:  "Windows-1252"
     connection2:
       driver:   "%database_driver%"
       host:     "%database_host%"
       port:     "%database_port%"
       dbname:   "%database_name%"
       user:     "%database_schema2_user%"
       password: "%database_schema2_password%"
       service:  "%database_service%"
       charset:  "Windows-1252"

orm:
  entity_managers:
    em1:
      connection:       connection1
      mappings:
              MyBundle: ~
              MyOtherBundle: ~
    em2:
      connection:       connection2
      mappings:
              MyOtherBundle: ~

結果:おっと、何かがうまくいかなかったようです。

1 / 1ReflectionException:クラスFQCN \ Of \ MyBundle \ Entity\Bが存在しません..。

「私はそれが存在しないことを知っています、私はあなたに今良い場所を見て欲しいです:FQCN \ Of \ MyOtherBundle \ Entity\Bのように」

エンティティ「B」へのパスを強制するにはどうすればよいですか?

4

2 に答える 2

3

スキーマが同じデータベースにある場合は、エンティティのテーブルを次のように定義するだけです。

Bundle\Entity\Class:
    type: entity
    table: schema.class

(yaml)

2番目の接続を指定する必要はありません。スキーマが明示的に示されている場合、これらの結合はDoctrine2で完全に機能します。

スキーマが異なるデータベースにある場合、すべての結合が両方のデータベースにクエリを実行するため、いくつかの悲惨な状況に陥ります。複数のレコード結合の場合、各エントリは結合を実行します。つまり、結果セット(BAD)内のオブジェクトの数に比例した数のクエリを実行します。

于 2012-12-18T20:38:42.300 に答える
2

問題が解決しました !データベーススキーマやアノテーションとはまったく関係ありませんでした。

エンティティAでは、私の個人的な設定者の1人がパラメータのタイプを強制していました:

public function setB(B $objB) { //... }

...そして私はBのFQCNを使うのを忘れました!だからAのものを使っていたのです。

次回は、注釈でFQCNを宣言せず、クラスの開始時に使用するように義務付けます。:)

于 2012-12-19T16:23:45.100 に答える