具有学说的抽象数据库实体

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 类根本不是抽象的,一开始这很麻烦。您可能想要重命名它或使其抽象化。 :)

【讨论】:

以上是关于具有学说的抽象数据库实体的主要内容,如果未能解决你的问题,请参考以下文章

实体的 Symfony 学说问题 [重复]

学说 ORM 和具有抽象类策略的工厂

学说:具有复合键的实体之间的 ManyToX 关系

学说(连接)类表继承中根实体的查询字段

将学说实体布尔字段设置为 0 而不是 null

学说刷新不更新相关的集合实体