【发布时间】:2020-09-24 12:43:05
【问题描述】:
问题:
在我的 Symfony 4.4 应用程序中有一个 Notification 实体类(通过 Doctrine ORM 2.7 管理)。在现实生活中,每个Notification 对象都可以与一个“主题”相关联。这个“主题”可能是Task、Project、Document、Invoice、Contract等,它们本身都是实体类。
如果有意义的话,理想情况下可以使用Notification::getSubject 和Notification::setSubject 方法。如果可能的话,NotificationRepository::findBy('subject' => $subject) 也可以使用——如果这有意义的话。
问题:
使用 Symfony 和 Doctrine ORM 设计 Notification 实体类和所有那些不同的“主题”实体类之间的关系的干净/好方法是什么?是否应该使用 OOP 设计模式?
【问题讨论】:
-
您可以在通知中添加外键来表示引用者主题;如果通知只能有一个主题,将是 onetoone,如果可以有多个主题,oneToMany,但我认为您想要 OneToOne。
-
我不知道有任何超级干净的方法可以做到这一点。 Doctrine 确实支持类继承,因此您可以让所有主题类都从 Subject 父级继承。但从 OOP 的角度来看,使用继承可能不是一个好主意。下面的答案更详细地解释了这一点。但是要求诸如 Document 之类的类意识到它们可能是通知的主题并不是很干净。如果您需要另一个关系,例如 Log 实体,这一切都会崩溃。