我目前的模型结构如下:
/**
* @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;
}
这里的想法是能够将评论绑定到任何其他表。到目前为止,这一切似乎都运行良好(当然,我仍在探索设计选项,因此可能有更好的方法来做到这一点......),但我注意到的一件事是子类有一些共同的领域我想搬到一个共同的父类。我不想将它们移到 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 {}
我认为这会起作用,但是教义数据库模式生成器抱怨我不能在 MappedSuperclass 上进行 OneToMany 映射。我没想到这会成为问题,因为 OneToMany 映射仍在根 BaseEntity 和 Comment 表之间。我应该使用不同的结构,还是以其他方式使这些字段通用而不将它们添加到 BaseEntity 上?