原则ORM:如何用n-n连接表定义1-n关系



所以,这有点复杂:我有两个表,说catsdogs。它们处于多对多关系中(可以称为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的第三个实体(除了CatDog),它与Cat提供一对一关系,与Dog提供一对一关系。使它与cats_dogs表一致只取决于您,并且默认情况下不是Doctrine任务。例如,你可以使用一些级联持久化选项。我相信这是Doctrine最有效的解决方案。

作为最后的注释,考虑到每个表应该映射一个或多个实体之间的特定关系,实际上表cats_dogs表示友谊关系,而表Award将表示两个朋友之间的奖励关系关系。

最新更新