所以,这有点复杂:我有两个表,说cats
和dogs
。它们处于多对多关系中(可以称为friendships
或其他什么),因此Doctrine会自动为我创建一个包含适当字段的表cats_dogs
。(默认为rowid, cat_id, dog_id
)
现在,假设我有第三个表award
,我想在其中授予其中一个友谊。因此,这里我需要一个引用cats_dogs
中的一行的字段。然而,由于这个表并不真正存在于我的模型之间,(Doctrine为我处理它)最优雅的解决方案是什么?
最后,我想在我的award
模型两个字段,一个cat
和一个dog
,谁需要在一个友谊。
我正在使用注释驱动程序。
是什么阻止您手动创建m:n表,而不是让doctrine为您完成?
原则的目的是从E/R模式映射对象,并使访问对象连接更容易。因此,我认为Doctrine自动提供的表cats_dogs
是必要的。它简明扼要,达到了目的,即它提供了猫的所有狗的列表,反之亦然,狗的所有猫的列表。
因此,我可以得出结论,最好创建名为Award
的第三个实体(除了Cat
和Dog
),它与Cat
提供一对一关系,与Dog
提供一对一关系。使它与cats_dogs
表一致只取决于您,并且默认情况下不是Doctrine任务。例如,你可以使用一些级联持久化选项。我相信这是Doctrine最有效的解决方案。
作为最后的注释,考虑到每个表应该映射一个或多个实体之间的特定关系,实际上表cats_dogs
表示友谊关系,而表Award
将表示两个朋友之间的奖励关系关系。