4

DoctrineでSymfonyを使用しています。

私の問題を解決するには、次のことを行います。

  • またはエンティティクラスを拡張するとき、ドクトリンが親のクラス @entity アノテーションを無視するようにしたい (@MappedSuperclass として表示するため)
  • または(これの方が望ましい)エンティティクラスを拡張するときは、このクラスがエンティティであることを知るために @MappedChildclass のようなものを子クラスに追加しますが、実際の実装と親クラスのマッピング

具体的な問題を見てみましょう:

私は3つのバンドルを持っています:

  • AppBridgeバンドル
  • ユーザーバンドル
  • プロファイルバンドル

UserBundle と UserProfile は分離する必要があります。AppBridgeBundle は 2 つのバンドル間のブリッジであり、両方を結合します。

UserBundle にはUserEntityがあります:

/**
 * @ORM\Entity
**/
class UserEntity {

     /**
     * @var \Acme\UserBundle\Interfaces\ProfileData
     * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Interfaces\ProfileData",
                      cascade={"persist"})
     * )
     */
    private $profileData;

     // ...
}

UserBundle には独自のインターフェイスProfileDataがあります(分離されており、このインターフェイスの実装を注入するだけで済みます)。

ProfileBundle にはProfileEntityがあります:

/**
 * @ORM\Entity
**/
class ProfileEntity implements Acme\ProfileEntity\Interfaces\Profile {

     // properties ...

}

ProfileBundle には、独自のインターフェースProfile (decoupled) があります。

基本的に ProfileData と Profile インターフェースは同じです。

現在、AppBridgeBundle は、UserBundle を ProfileBundle に適合させるために、 Adapter of Profile および ProfileData インターフェイスを導入しています。

class ProfileAdapter  extends \Acme\ProfileBundle\Entity\ProfileEntity
                      implements   \Acme\UserBundle\Interfaces\ProfileData,
                                   \Acme\ProfileBundle\Interfaces\Profile {

}

次に、インターフェースの実装をconfig.ymlアプリ構成に挿入します。

orm:
     resolve_target_entities:
          Acme\UserBundle\Interfaces\ProfileData: Acme\AppBridgeBundle\Entity\ProfileAdapter

問題は、doctrine スキーマを更新すると、EntityAcme\AppBridgeBundle\Entity\ProfileAdapterではないエラーがスローされることです。

  • ProfileAdapter をマーク@Entityすると、2 つの別個のテーブルが作成されます。必要ありません。

  • ProfileAdapter を@EntityProfileEntity と同じ名前でマークすると@Table('profileentity')、エラーがスローされますtable profile already exists

  • ProfileEntity に注釈を付けてマークする@ORM\MappedSuperclassremove @Entity、ProfileEntity クラスのデフォルトの実装が失われます (そのため、ブリッジなしでは機能しなくなります)。

  • ProfileEntity をマーク@InheritanceType("SINGLE_TABLE")すると、不要な識別子フィールドがテーブルに追加されます。

助言がありますか?

4

2 に答える 2

0

あなたの例を使って私がしたことと同じ問題がありました:

  • \Acme\ProfileBundle\Entity\ProfileEntityに移動\Acme\ProfileBundle\Model\ProfileEntity
  • ProfileEntityクラスを再宣言しabstractますが、すべての ORM 命令はそのまま残します
  • 新しいモデルProfileAdapterを拡張するために再宣言するProfileEntity
  • ProfileAdapterのみとしてマークし@ORM\Entity、残りのすべての@ORM*命令はモデル クラスに残します

長所:

  • 追加のテーブルなし
  • 追加フィールドなし
  • ブリッジなしで動作可能

短所:

  • 新しいバンドルのインストールごとに、抽象モデルを拡張するエンティティを作成する必要があります
于 2014-02-06T10:38:38.717 に答える