具有学说的抽象数据库实体
Posted
技术标签:
【中文标题】具有学说的抽象数据库实体【英文标题】:Abstract database entity with doctrine 【发布时间】:2016-01-24 17:09:55 【问题描述】:Symfony 3 with Doctrine。
我有一个名为“MainBundle”的包,它存在于多个 Symfony 项目(P1、P2 和 P3)中。 MainBundle 包含不同的实体,例如“AbstractColor.php”。
/*** AbstractColor.php ***/
/**
* @ORM\Entity
* @ORM\Table(name="color")
*/
class AbstractColor
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=7)
*/
protected $code;
/* ... getter and setter ... */
我想在 P1、P2 和 P3 中使用颜色实体,但在 P3 中我想添加一个新字段“名称”。为此,我在 P3“Color.php”中创建了一个新实体:
/*** Color.php ***/
/**
* @ORM\Entity
* @ORM\Table(name="color")
*/
class Color extends \MainBundle\AbstractColor
/**
* @ORM\Column(type="string", length=100)
*/
protected $name;
/* ... getter and setter ... */
P3 文件结构:
应用程序 bin 源 P3 捆绑包 实体 Color.php 变量 供应商 主包 实体 AbstractColor.php我的问题
上面的代码不起作用,因为我多次定义了表格“颜色”。我也尝试过“映射超类”学说,但是我不能使用 OneToMany 关联。
有什么好方法可以解决我的问题吗?谢谢!
【问题讨论】:
【参考方案1】:使用单表继承而不是 MappedSuperclass,请在此处查看文档:http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#single-table-inheritance
基本上,将注释更改为您的 AbstractColor:
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="type", type="string")
* @DiscriminatorMap("AbstractColor" = "AbstractColor", "Color" = "Color")
*/
class AbstractColor
这样,表格不会干扰,并且您将在表格“颜色”中有一个“类型”列,这将使 Doctrine 知道实体是 AbstractColor 还是 Color 的实例。
哦,顺便说一下,你的 AbstractColor 类根本不是抽象的,一开始这很麻烦。您可能想要重命名它或使其抽象化。 :)
【讨论】:
以上是关于具有学说的抽象数据库实体的主要内容,如果未能解决你的问题,请参考以下文章