是否可以覆盖symfony2中的实体

时间:2014-06-19 16:46:39

标签: symfony doctrine-orm

在我的项目中,我有一个工作正常的捆绑,现在我需要创建第二个捆绑。我的第二个包的一个实体与我的第一个包+相同字段的实体具有相同的名称,除了它必须有两个额外的字段,我需要两个包两个在数据库中的同一个表上工作。如何从实体扩展以添加字段并保留扩展字段?

知道我尝试了经典的继承,但我从教义中得到了一个漂亮的错误

  [Doctrine\DBAL\Schema\SchemaException]
  The table with name 'postgres.article' already exists.

这里没有任何意外,因为该表确实存在,我如何获得更新它的原则而不是尝试创建它?

1 个答案:

答案 0 :(得分:1)

这称为Class Table Inheritance。您可以拥有父实体和扩展它的子实体。您的其他字段存储在您孩子的表中,主键链接到父表。

以下是我现有代码中的一个基本示例,您可以根据自己的需要对其进行修改。我已经排除了存取方法。

陷阱!使用CTI时,您必须设置自己的属性protected,将其设置为私有不允许共享它们。

父类

/**
 * Item
 *
 * @ORM\Table(name="`item`") 
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type_hint", type="string")
 * @DiscriminatorMap({"physical_item" = "PhysicalItem"})
 * @ORM\Entity(repositoryClass="\Acme\MainBundle\Entity\ItemRepository")
 */
class Item
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    protected $name;
}

子表

/**
 * PhysicalItem
 *
 * @ORM\Table(name="`physical_item`")
 * @ORM\Entity
 */

class PhysicalItem extends Item
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="weight", type="string", length=255, nullable=true)
     */
    protected $weight;
}

在此示例中,您将拥有一个item表和一个physical_item表。 item的所有属性都存储在那里,physical_item的额外属性存储在它自己的表中。当您使用Entity类时,您将加入对所有属性的访问权限。