实体类与其他各种实体类之间的关系

时间:2020-09-24 12:43:05

标签: symfony doctrine

问题:

在我的Symfony 4.4应用程序中,有一个Notification实体类(通过Doctrine ORM 2.7管理)。在现实生活中,每个Notification对象都可以与一个“对象”相关。此“主题”可以是TaskProjectDocumentInvoiceContract等,它们本身都是实体类

理想情况下,有可能使用Notification::getSubjectNotification::setSubject方法。并且如果可能的话,NotificationRepository::findBy('subject' => $subject)也可以工作–那样有意义。

问题:

使用Symfony和Doctrine ORM在Notification实体类和所有这些不同的“主题”实体类之间设计实现的干净/好方法是什么?是否应该使用OOP设计模式?

1 个答案:

答案 0 :(得分:1)

由于您的问题相当模糊,我认为您应该开始定义实体。 一个好的方法是制作一个Entity Relationship Diagram。 首先考虑实体将如何在它们之间进行交互是一件好事。 开发新功能时,图表非常有用。

然后,当您对要执行的操作有清晰的想法时,只需编写代码即可。

对于您要问的问题,我尝试制作这样的图,但是它可能是不完整的,因为我不了解您的项目:

enter image description here

当然,我并没有代表您描述的每个实体,但是您知道了。 继承的好处是,您可以调用Notification::getSubject,然后知道它是哪种主题

您将创建实体Subject,然后扩展TaskProjectDocumentInvoice,{{1} }等。

要在学说中创建继承:

Contract
#src\Entity\Subject
/**
 * @ORM\Table(name="subject")
 * @ORM\Entity(repositoryClass="App\Repository\SubjectRepository")
 * @ORM\InheritanceType(value="JOINED")
 * @ORM\DiscriminatorColumn(name="subject_type", )
 * @ORM\DiscriminatorMap(value={SUB_TYPE_DOCUMENT=Document::class, SUB_TYPE_PROJECT=Project::class, SUB_TYPE_TASK=Task::class})
 */
abstract class Subject{
    const SUB_TYPE_DOCUMENT = 'DOCUMENT';
    const SUB_TYPE_PROJECT = 'PROJECT';
    const SUB_TYPE_TASK = 'TASK';
...
}
#src\Entity\Document
class Document extends Subject{
...
}
#src\Entity\Project 
class Project extends Subject{
...
}

更多信息,请访问:https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/inheritance-mapping.html

这是一种非常经典的处理方式。现在,您问是否有#src\Entity\Task class Task extends Subject{ ... } 要使用。 想到的可能是Decorator。我建议您阅读一下。

如果以上方法均无济于事,请编辑您的问题并添加有关所需内容的更多详细信息...