我有一个symfony2项目,其中包含六个主要实体类型。我正在使用Doctrine。
这些实体有许多相同的字段,例如creatorId,Created,Updated,Status和Title。目前,每个实体都是单独定义的 - 当然,基本代码(以及数据库字段)也有很多重复。
我在学习symfony2时正在学习OOP,所以我在这里摸索,但我的问题是:
将每个实体保持为独立的类是否被视为最佳做法?或者最好为共享属性创建一个新的基类,然后让其他实体扩展基础实体?
红利问题:
如果构建从父类继承的实体实际上更好,我可以模糊地想象两个选项:
1)父类是一个完全映射的Doctrine实体,在数据库中有自己的表,我们将调用它,哦,我们称之为“节点”。因此,调用子实体将始终在节点表和子内容类型实体表之间进行额外的连接。
2)父类是 - 嗯 - 抽象类(?),定义其他实体的共享属性,但没有实际的数据库存在。每个子实体分别实现共享属性,因此DB结构与我当前的设置保持一致,但在定义实体时(可能)可以减少重复的代码。
我主要是在寻找有关整体问题的建议 - 扩展基础实体的子实体,或者只是单独的实体。虽然欢迎提示,但不要指望任何人解释最佳实施。
答案 0 :(得分:11)
我会创建一个抽象的基本实体类,让你的其他实体扩展它。例如:
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等)(例如“车辆”),您可以使用像Discriminator Map这样的东西。 This article on Inheritence Mapping可能是有用的阅读。