【发布时间】:2016-05-18 17:54:46
【问题描述】:
我正在开发一个管理法庭口译服务的应用程序(使用 Doctrine 和 Zend Framework 2)。涉及的人很多,他们具有各种专业角色,因此有一个 Person 超类和子类。类层次在纵向上并不复杂——一代继承就足够了——但是横向方面给我带来了麻烦。
我认为 mapped superclasses 不适合我的情况。我也考虑过single-table inheritance,但这很快就会变得丑陋,因为子类有自己的实体关系,太多东西不能优雅地塞进一个表中。
这给我们留下了class table inheritance,这在大多数方面都非常合适,但是......我将有很多情况,子类 User(用于身份验证)和子类 Interpreter 将(或应该)指向父数据表中的同一行,因为它们代表现实中的同一个人。但是由于有鉴别器列,您必须选择一个或另一个,否则会创建两个不同的行来保存相同的数据——规范化警察应该会为您服务。
我认为用户或解释器实体可能必须简单地与 Person 实体建立一对一的关系,并以半手动方式处理。我认为另一种选择是将 User 折叠成 Person ——但这很丑,因为很多人不会进行身份验证,也不会拥有或不需要密码。 我看过 Doctrine inheritance, several entities extending the same super class 和 How to change and entity type in Doctrine2 CTI Inheritance(除其他外)没有人解决这个问题。
所以,我想知道是否有人有任何建议。谢谢。
【问题讨论】:
-
可能是个人喜好,但我会将 User 作为一个独立的类。它可能使用与其他表相同的基础表,但独立于身份验证。然后可以使用 get 方法将其链接到适当的 Person 对象。
-
@Matt S:当您说“可能使用与其他表相同的基础表”时,您是在暗示可能有多个实体类映射到同一个表上?聪明的!但我的问题是电子邮件字段,理所当然地是用户的一个属性,是(截至目前)我的个人实体的列/属性,因为每个人都有一封电子邮件。也许我没有关注...我可以使用 getter 从 User 获取 Person,显然,一种或另一种方式,但我不希望身份验证变得不必要地复杂——Doctrine 模块在这方面做得很好—— - 我猜你同意。
标签: php inheritance orm doctrine-orm