具有学说

时间:2016-01-24 17:09:56

标签: inheritance doctrine symfony

Symfony 3 with Doctrine。

我有一个名为“MainBundle”的Bundle,存在于多个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中我想添加一个新字段“name”。为此,我在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文件结构:

  • 应用
  • SRC
    • P3Bundle
      • 实体
        • Color.php
  • VAR
  • 供应商
    • MainBundle
      • 实体
        • AbstractColor.php

我的问题

上面的代码不起作用,因为我多次定义表“color”。我也尝试了“Mapped Superclass”的学说,但后来我不能使用OneToMany关联。

有解决问题的好方法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

使用单表继承而不是MappedSuperclass,请在此处查看文档:{​​{3}}

基本上,将注释更改为AbstractColor:

/**
 * @Entity
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="type", type="string")
 * @DiscriminatorMap({"AbstractColor" = "AbstractColor", "Color" = "Color"})
 */
class AbstractColor

这样,表格不会干扰,你会有一个列"类型"在你的桌子上"颜色"这将允许Doctrine知道实体是否是AbstractColor或Color的实例。

哦,顺便说一句,你的类AbstractColor根本就不是抽象的,起初非常令人不安。您可能想要重命名它或使其抽象化。 :)