php - 两个不同子类扩展同一个实体实例时的 Doctrine 继承策略

标签 php inheritance orm doctrine-orm

我正在开发一个用于管理法庭口译服务的应用程序(使用 Doctrine 和 Zend Framework 2)。有很多人参与其中,他们具有各种专门的角色,因此有一个 Person 父类(super class)和子类。类层次结构在垂直方面并不复杂——一代继承就足够了——但水平方面给我带来了麻烦。

我不认为mapped superclasses适合我的情况。我也考虑过single-table inheritance但这很快就会变得丑陋,因为子类有自己的实体关系,太多的东西无法优雅地塞进一个表中。

这给我们留下了 class table inheritance ,这在大多数方面都非常适合,但是......我会遇到很多情况,其中子类 User(用于身份验证)和子类 Interpreter 将(或应该)指向父数据表中的同一行,因为他们代表现实中的同一个人。但是由于鉴别器列,您必须选择一个或另一个,或者创建两个不同的行来保存相同的数据——而规范化策略应该让您做到这一点。

我认为 User 或 Interpreter 实体可能只需要与 Person 实体建立一对一关系,然后半手动处理。我想的另一个选择是将 User 折叠成 Person——但这很丑陋,因为很多人不会进行身份验证,也不会拥有或不需要密码。 我看过 Doctrine inheritance, several entities extending the same super classHow to change and entity type in Doctrine2 CTI Inheritance (除其他外)没有人解决这个问题。

所以,我想知道是否有人有任何建议。谢谢。

最佳答案

听起来您正在管理一堆关于 Person 的数据,这些数据可以识别世界上的个人。由于系统中只有一部分人是用户,我认为对身份验证、审计日志、通知等的关注与的关注是分开的类层次结构。

我建议从 Person 类层次结构中删除 User。也许将它重命名为 Account,让它看起来不那么人性化。 Account 可以有一个 owner 属性,它与 Person 有关系。如果您想使用Person 的电子邮件地址作为身份验证的标识符,那很好。如果您稍后想要添加一个 username,那将是 Account 的一个属性,因为它只在该上下文中有意义。

关于php - 两个不同子类扩展同一个实体实例时的 Doctrine 继承策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37306930/

相关文章:

c++ - 使用继承的成员函数指针的 unordered_map,使用 std :function

mysql - EPERM : operation not permitted error : Prisma . 输入命令后 'npx migrate dev --name init'

python - sqlalchemy 中的多个/拆分类关联

python - 如何在 SQL 数据库中表示层次结构

php - Yii2 - 从另一个控制台命令中调用 Yii 控制台命令?

PHP Nusoap session

php - 在 excel 中导出数据,然后使用 PHP 从 excel 导入。数据库是MySQL

oop - 菱形继承(钻石问题)

php - Symfony 2 根据用户代理属性加载不同的模板

javascript - ES6子类继承属性