HasManyThrough 与 HasAndBelongsToMany
HasManyThrough vs HasAndBelongsToMany
这些 HasManyThrough 与 HasAndBelongsToMany 有什么区别??
https://docs.strongloop.com/display/public/LB/HasManyThrough+relations
VS
https://docs.strongloop.com/display/public/LB/HasAndBelongsToMany+relations
答案在于关系名称本身。我将使用文档中提供的示例。
HasManyThrough:
- 医生预约了很多病人
患者通过预约有很多医生
在这里,医生和患者都是通过约会彼此相关的,但没有直接关系。预约模型有助于建立一种关系,因为它既属于医生又属于患者。因为预约,一个病人可以预约尽可能多的医生。一个医生可以看多少预约的病人him/her.
HasAndBelongsToMany:
- 学生有很多 classes 并且属于很多 classes。
classes有很多学生,属于很多学生。
在这里,学生和 classes 彼此直接相关。学生通常会参加许多 class 课程,例如物理、化学等 - 因此他们有很多 class 课程。由于出勤是在每个 class 中进行的,因此学生属于许多 class。
同样,class 有很多学生参加 - 所以 class 有很多学生。并且由于每个学生的出勤率都保持不变,因此 class 属于许多学生。
注:
- 如果两个 class 是通过像约会这样的干预模型与多对多关系相关联的,那么使用 hasManyThrough。
- 如果两个class直接关联多对多关系,使用hasAndBelongsToMany
hasManyThrough
只是定义了直通模型的 hasMany
关系。参见 https://github.com/strongloop/loopback-datasource-juggler/blob/4c9e91423f3d356bb544790075dcb7f891450096/lib/relation-definition.js#L659 中的 params.through
。
hasAndBelongsToMany
本质上是在两边设置 hasManyThrough
关系的快捷方式。如果尚未定义 through
模型,它只是连接两个模型名称并尝试使用该名称查找模型,如果失败,它只是尝试从 table 中获取具有该名称的关系(https://github.com/strongloop/loopback-datasource-juggler/blob/4c9e91423f3d356bb544790075dcb7f891450096/lib/relation-definition.js#L1630).
如果您在 Assembly
和 Part
之间定义 hasAndBelongsToMany
关系,它将在 Assembly
之间设置 hasMany
和 belongsTo
关系和 AssemblyPart
以及 Part 和 AssemblyPart 之间的另一对。如果未定义 AssemblyPart
模型,它将尝试使用名为 assemblypart
的 table(或者我猜如果是 MongoDB 的集合,我主要是 RDBMS 专家)。它还将定义从 Assembly
到 Part
的 hasManyThrough
关系,使用 AssemblyPart
作为直通模型(以便 assembly.parts
可用)及其对应的 Part
到 Assembly
(part.assemblies
)。
我想说的是,您可以通过手动定义一个 AssemblyPart
模型与相应的 hasMany
和 belongsTo
来实现与 hasAndBelongsToMany
完全相同的效果Assembly
和 Part
模型以及两个 hasManyThrough
:从 Assembly
到 Part
和从 Part
到 Assembly
。
这些 HasManyThrough 与 HasAndBelongsToMany 有什么区别??
https://docs.strongloop.com/display/public/LB/HasManyThrough+relations
VS
https://docs.strongloop.com/display/public/LB/HasAndBelongsToMany+relations
答案在于关系名称本身。我将使用文档中提供的示例。
HasManyThrough:
- 医生预约了很多病人
患者通过预约有很多医生
在这里,医生和患者都是通过约会彼此相关的,但没有直接关系。预约模型有助于建立一种关系,因为它既属于医生又属于患者。因为预约,一个病人可以预约尽可能多的医生。一个医生可以看多少预约的病人him/her.
HasAndBelongsToMany:
- 学生有很多 classes 并且属于很多 classes。
classes有很多学生,属于很多学生。
在这里,学生和 classes 彼此直接相关。学生通常会参加许多 class 课程,例如物理、化学等 - 因此他们有很多 class 课程。由于出勤是在每个 class 中进行的,因此学生属于许多 class。 同样,class 有很多学生参加 - 所以 class 有很多学生。并且由于每个学生的出勤率都保持不变,因此 class 属于许多学生。
注:
- 如果两个 class 是通过像约会这样的干预模型与多对多关系相关联的,那么使用 hasManyThrough。
- 如果两个class直接关联多对多关系,使用hasAndBelongsToMany
hasManyThrough
只是定义了直通模型的 hasMany
关系。参见 https://github.com/strongloop/loopback-datasource-juggler/blob/4c9e91423f3d356bb544790075dcb7f891450096/lib/relation-definition.js#L659 中的 params.through
。
hasAndBelongsToMany
本质上是在两边设置 hasManyThrough
关系的快捷方式。如果尚未定义 through
模型,它只是连接两个模型名称并尝试使用该名称查找模型,如果失败,它只是尝试从 table 中获取具有该名称的关系(https://github.com/strongloop/loopback-datasource-juggler/blob/4c9e91423f3d356bb544790075dcb7f891450096/lib/relation-definition.js#L1630).
如果您在 Assembly
和 Part
之间定义 hasAndBelongsToMany
关系,它将在 Assembly
之间设置 hasMany
和 belongsTo
关系和 AssemblyPart
以及 Part 和 AssemblyPart 之间的另一对。如果未定义 AssemblyPart
模型,它将尝试使用名为 assemblypart
的 table(或者我猜如果是 MongoDB 的集合,我主要是 RDBMS 专家)。它还将定义从 Assembly
到 Part
的 hasManyThrough
关系,使用 AssemblyPart
作为直通模型(以便 assembly.parts
可用)及其对应的 Part
到 Assembly
(part.assemblies
)。
我想说的是,您可以通过手动定义一个 AssemblyPart
模型与相应的 hasMany
和 belongsTo
来实现与 hasAndBelongsToMany
完全相同的效果Assembly
和 Part
模型以及两个 hasManyThrough
:从 Assembly
到 Part
和从 Part
到 Assembly
。