2014-01-16 79 views
7

我有一个symfony2项目,其中包括六个主要的实体类型。我正在使用Doctrine。symfony2 - 扩展基础实体类还是保持实体无关?

这些实体具有许多相同的字段,例如creatorId,Created,Updated,Status和Title。目前,每个实体都是单独定义的 - 所以当然,基本代码(以及db字段也是)有很多重复。

我学习OOP为我学习Symfony2的,所以我在这里摸索,但我的问题是这样的:

难道是考虑到保持各实体为一个自包含的类最佳做法?或者最好为共享属性创建一个新的基类,然后让其他实体扩展基础实体?

奖金问题:

如果它实际上是更好地建设从父类继承的实体,我隐约显现两个选项:

1)父类是完全映射主义实体,在数据库中有自己的表格,我们将称之为“哦”,我们称之为“节点”。因此,调用子实体将始终涉及Nodes表和Child内容类型实体表之间的其他连接。

2)父类是 - um - 抽象类(?),定义其他实体的共享属性,但没有实际的数据库存在。每个子实体都单独实现共享属性,以便DB结构与我当前的设置保持一致,但是在定义实体时可能(可能)重复代码少。

我主要是在寻找关于整个问题的建议 - 子实体扩展一个基本实体,或者只是单独的实体。不要期望任何人解释最好的实现,尽管提示是受欢迎的。

回答

9

我会创建一个抽象的基础实体类,并让其他实体扩展它。例如:

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

    /** 
    * @var \datetime $created 
    * 
    * @ORM\Column(type="datetime") 
    */ 
    private $created; 

    /** 
    * @var \datetime $updated 
    * 
    * @ORM\Column(type="datetime") 
    */ 
    private $updated; 

... 

} 

然后每个实体可以扩展:

class SomeEntity extends AbstractEntity 
{ 

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

选择2是正确的 - 不会有任何具体的表在数据库中的抽象类。

如果需要的话,您仍然可以使用扩展基类的其他抽象类。例如,AbstractVehicle实体会扩展基本实体。例如,如果您希望AbstractVehicle的所有子实体(例如Car,Van等)位于同一个表格(例如'vehicle')中,则可以使用类似Discriminator Map的东西。 This article on Inheritence Mapping可能是有用的阅读。

+1

太棒了,非常感谢您对进一步学习的明确答案和宝贵方向。单表继承与类表继承正是我在Doctrinese中掌握的术语。 –