一个实体服务于多个其他实体

时间:2016-02-02 09:13:51

标签: php symfony doctrine-orm

案例

在我的Symfony应用程序中,我有以下实体:
- 客户
- 联系(ManyToMany与客户)

我还创建了一个Note实体(带附件,但这是一个简单的1-N与Note的关系),我想与Customer和Contact联系。但问题是,如何?

可能的解决方案1 ​​

在Customer / Note和Contact / Note之间创建标准的OneToMany关系。 Note实体有两列:customer_idcontact_id 这肯定会正常工作,但是,总有一列具有NULL值。感觉就像糟糕的设计。

可能的解决方案2

ManyToMany或OneToMany带有额外的连接表 可以拥有Notes的每个实体都在创建一个连接表:customer_notes,contact_notes等。

优点:所有字段都填充数据
缺点:ManyToMany感觉不是正确的解决方案:要让客户与Note相关,我必须使用foreach$customers[0],因为Doctrine会返回一组客户,这些客户应该只返回一个客户当然。具有额外连接的OneToMany不是双向的,但我稍后会再回来。

可能的解决方案3

映射的超类,例如Link 1 entity with many others kind of entities 我可以使用$ notes属性创建一个超类,并使用此超类扩展Customer或Contact实体。但在阅读上述相关问题后,我怀疑这是否是最佳解决方案。 Many-To-One with multiple target entities中的例子是“简单”:水果和蔬菜都是食物的类型。但客户和联系人没有共同点,只是他们都可以有笔记。

注意:单向还是双向?

最重要的方向是客户 - >笔记。所有注释必须显示在Customer/show.html.twig页面或Contact/show.html.twig页面上。另一个方向对我的面包屑很好(见其他说明)。

注意:URL构造

如果我创建/ customer / {customer_id} / note / {note_id}等路线以显示客户的备注,我可以使用URL参数$ customer_id检索Customer对象。因此,我不需要双向关系,因为我可以通过URL检索客户。但是,对于我需要复制代码的每个实体。在Note上为CRUD操作提供可共享代码会很好,这适用于Note所属的实体。

摘要

正如您所看到的,我的问题有很多可能性。我对Symfony比较陌生,我想以“专业”的方式解决它,我希望得到一些关于如何解决这个问题的指导。

编辑:

  • 可以为可以拥有Notes(客户,联系人或未来目的的任何类型的实体:任务,员工等)创建注释。
  • 一切都在一个捆绑(AppBundle)
  • 说实话,第一个重点是获得客户和联系人备注。我可以通过创建解决方案#4来解决它:

可能的解决方案4

为每种Note(CustomerNote,ContactNote)创建一个Note实体。这只是一个简单的OneToMany关系。然而,很多(几乎)重复的代码,使用我正在寻找的解决方案可以避免这种代码。

我不反对这个解决方案,但感觉存在比这更好的解决方案,当CTRL-C和CTRL-V很多代码时我觉得很愚蠢;)

0 个答案:

没有答案