在我的项目中,我有一个工作正常的捆绑,现在我需要创建第二个捆绑。我的第二个包的一个实体与我的第一个包+相同字段的实体具有相同的名称,除了它必须有两个额外的字段,我需要两个包两个在数据库中的同一个表上工作。如何从实体扩展以添加字段并保留扩展字段?
知道我尝试了经典的继承,但我从教义中得到了一个漂亮的错误
[Doctrine\DBAL\Schema\SchemaException]
The table with name 'postgres.article' already exists.
这里没有任何意外,因为该表确实存在,我如何获得更新它的原则而不是尝试创建它?
答案 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类时,您将加入对所有属性的访问权限。