首页 文章

是否可以覆盖symfony2中的实体

提问于
浏览
0

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

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

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

这里没有任何意外,因为该表确实存在,如何让doctrine更新它而不是尝试创建它?

1 回答

  • 1

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

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

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

    Parent Class

    /**
     * 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;
    }
    

    Child Table

    /**
     * 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类时,您将加入对所有属性的访问权限 .

相关问题