这称为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 类时,您将拥有对所有属性的访问权限。