【问题标题】:is it possible to override an entity in symfony2是否可以覆盖 symfony2 中的实体
【发布时间】:2014-06-19 16:46:38
【问题描述】:

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

知道我尝试了经典继承,但我从学说中得到了一个美丽的错误

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

这并不奇怪,因为该表确实存在,我该怎么做才能让学说更新它而不是尝试创建它?

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案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 类时,您将拥有对所有属性的访问权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多