5

バンドル全体で 1 対多の関係を定義しようとすると、次のことが起こります。

クラス 'Mana\ClientBundle\Entity\Member' はチェーン構成された名前空間 Mana\SplitBundle\Entity で見つかりませんでした

更新 3:

私は今、関係が達成できるかできないかという相反する答えを見てきました. それが可能であると仮定すると (ここでスタックオーバーフローの他の人がそれを行ったように見えるため)、バンドルを AppKernel.php に登録し、エンティティに注釈を入力する以外に、どのような構成が必要ですか? resolve_target_entity_listener違いはないように見えました。

更新 2:

さて、私はここで私の深みから抜け出していることを知っていますが、これは Client エンティティを表示しようとしてコードをステップ実行しているときに観察したことです。

プロファイラーのエラー メッセージ

Mana\SplitBundle\Entity\Client#members で指定されたターゲット エンティティ 'Mana\ClientBundle\Entity\Member' は不明であるか、エンティティではありません。

これは、SchemaValidator が true と評価されるために発生$cmf->isTransient($assoc['targetEntity'])します。ここで、targetEntity は Member エンティティ内にあります。PHPdoc コメントは、このエンティティのメタデータが読み込まれていないことを示唆しています。これを正しく理解していれば、関係に関する注釈がロードされていないことを意味します。しかし、変数値を観察すると、注釈が読み取られたことが示唆されます。

痛いほど明白であるべき何かを完全に見逃していますか?それとも、左翼手で遠すぎますか?

更新 1:

doctrine:mapping:info不正な FQCN を検出することを確認しました。データフィクスチャは正しいです。デフォルト接続と分割接続の両方に対するエンティティ マネージャとデータベース接続の使用は正しいです。エラーは持続し、Client エンティティで定義されたいずれかのリレーションシップ (OneToMany または ManyToOne) で発生する可能性があります。

config.yml:

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
            mapping_types: 
                enum:       string
          split:
            driver:   "%database_driver2%"
            host:     "%database_host2%"
            port:     "%database_port2%"
            dbname:   "%database_name2%"
            user:     "%database_user2%"
            password: "%database_password2%"
            charset:  UTF8
            mapping_types: 
                enum:       string
    entity_managers:
      default:
        connection: default
        mappings:
          ManaClientBundle: ~
      split:
        connection: split
        mappings:
          ManaSplitBundle: ~

クライアント エンティティ:

/**
 * @ORM\OneToMany(targetEntity="Mana\ClientBundle\Entity\Member", mappedBy="client")
 * @ORM\OrderBy({"dob" = "ASC"})
 */
protected $members;

メンバー エンティティ:

 /**
 * @ORM\ManyToOne(targetEntity="Mana\SplitBundle\Entity\Client",inversedBy="members",cascade={"remove", "persist"})
 * @ORM\JoinColumn(name="cid", referencedColumnName="id")
 * 
 */
 protected $client;

教義のマッピング:

$ php app/console doctrine:mapping:info
Found 12 mapped entities:
[OK]   Mana\ClientBundle\Entity\Agency
[OK]   Mana\ClientBundle\Entity\Center
[OK]   Mana\ClientBundle\Entity\Contact
[OK]   Mana\ClientBundle\Entity\Contactdesc
[OK]   Mana\ClientBundle\Entity\Counties
[OK]   Mana\ClientBundle\Entity\Ethnicity
[OK]   Mana\ClientBundle\Entity\Incomehistory
[OK]   Mana\ClientBundle\Entity\Incomesrc
[OK]   Mana\ClientBundle\Entity\Member
[OK]   Mana\ClientBundle\Entity\Note
[OK]   Mana\ClientBundle\Entity\Referral
[OK]   Mana\ClientBundle\Entity\User

$ php app/console doctrine:mapping:info --em=split
Found 1 mapped entities:
[OK]   Mana\SplitBundle\Entity\Client
4

1 に答える 1

3

Using Relationships with Multiple Entity Managersが表示されるはずです。

別々の接続とエンティティマネージャーを持つ別々のデータベースがある場合、クロスバンドル関係は Doctrine で管理できません。代わりに、この場合、Client エンティティは同じスキーマ/バンドルに存在し、外部ソースから定期的に更新される必要があります。

ただし、データベースへの接続が 1 つしかなく、そのためのエンティティ マネージャーが 1 つしかない場合は、バンドル間の関係を管理できます。(ここで説明:クロス プロジェクト エンティティの OneToMany 関係 (Symfony2/Doctrine) )

于 2013-04-17T05:47:00.773 に答える