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 を
@Entity
ProfileEntity と同じ名前でマークすると@Table('profileentity')
、エラーがスローされますtable profile already exists
ProfileEntity に注釈を付けてマークする
@ORM\MappedSuperclass
とremove @Entity
、ProfileEntity クラスのデフォルトの実装が失われます (そのため、ブリッジなしでは機能しなくなります)。ProfileEntity をマーク
@InheritanceType("SINGLE_TABLE")
すると、不要な識別子フィールドがテーブルに追加されます。
助言がありますか?