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 属于许多学生。

注:

  1. 如果两个 class 是通过像约会这样的干预模型与多对多关系相关联的,那么使用 hasManyThrough。
  2. 如果两个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).

如果您在 AssemblyPart 之间定义 hasAndBelongsToMany 关系,它将在 Assembly 之间设置 hasManybelongsTo 关系和 AssemblyPart 以及 Part 和 AssemblyPart 之间的另一对。如果未定义 AssemblyPart 模型,它将尝试使用名为 assemblypart 的 table(或者我猜如果是 MongoDB 的集合,我主要是 RDBMS 专家)。它还将定义从 AssemblyParthasManyThrough 关系,使用 AssemblyPart 作为直通模型(以便 assembly.parts 可用)及其对应的 PartAssembly (part.assemblies)。

我想说的是,您可以通过手动定义一个 AssemblyPart 模型与相应的 hasManybelongsTo 来实现与 hasAndBelongsToMany 完全相同的效果AssemblyPart 模型以及两个 hasManyThrough:从 AssemblyPart 和从 PartAssembly