私は現在、次のようなモデル構造を持っています。
/**
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="related_type", type="string")
* @ORM\DiscriminatorMap({"type_one"="TypeOne", "type_two"="TypeTwo"})
*/
abstract class BaseEntity {
... (all the usual stuff, IDs, etc)
/**
* @ORM\OneToMany(targetEntity="Comment", mappedBy="baseEntity")
*/
private $comments;
}
/**
* @ORM\Entity
*/
class TypeOne extends BaseEntity {
/**
* @ORM\Column(type="string")
*/
private $name;
/**
* @ORM\Column(type="string")
*/
private $description;
}
/**
* @ORM\Entity
*/
class TypeTwo extends BaseEntity {
/**
* @ORM\Column(type="string")
*/
private $name;
/**
* @ORM\Column(type="string")
*/
private $description;
}
/**
* @ORM\Entity
*/
class Comment {
... (all the usual stuff, IDs, etc)
/**
* @ORM\ManyToOne(targetEntity="BaseEntity", inversedBy="comments")
*/
private $baseEntity;
}
ここでの考え方は、コメントを他のテーブルのいずれかに結び付けることができるようにすることです。これは今のところすべて正常に機能しているようです(もちろん、私はまだ設計オプションを検討しているので、これを行うためのより良い方法があるかもしれません...)が、私が気付いた1つのことは、サブクラスにいくつかの共通フィールドがあることです共通の親クラスに移動したいと思います。BaseEntityの子である他のオブジェクトがあるので、それらをBaseEntityに移動したくありませんが、それらのフィールドはありません。
次のように、途中でMappedSuperclass親クラスを作成することを検討しました。
/**
* @ORM\MappedSuperclass
*/
abstract class Common extends BaseEntity {
/**
* @ORM\Column(type="string")
*/
private $name;
/**
* @ORM\Column(type="string")
*/
private $description;
}
/**
* @ORM\Entity
*/
class TypeOne extends Common {}
/**
* @ORM\Entity
*/
class TypeTwo extends Common {}
これでうまくいくと思いましたが、Doctrineデータベーススキーマジェネレーターは、MappedSuperclassにOneToManyマッピングを設定できないと不平を言っています。OneToManyマッピングはまだルートBaseEntityとCommentテーブルの間にあるため、これが問題になるとは思っていませんでした。BaseEntityに追加せずにこれらのフィールドを共通にするために使用する必要がある別の構造、または他の方法はありますか?