HasManyThrough vs HasAndBelongsToMany

时间:2015-10-24 01:13:55

标签: loopbackjs

2 个答案:

答案 0 :(得分:6)

答案在于关系名称本身。我将使用文档中提供的示例。

HasManyThrough

  • 医生通过预约让很多患者
  • 患者通过预约接诊了很多医生

    在这里,医生和患者通过预约相互关联,但没有直接关系。预约模型有助于建立一种关系,因为它属于医生和患者。由于预约,患者可以预约任意数量的医生。并且医生可以看到许多预定他/她的患者。

<强> HasAndBelongsToMany

  • 学生有很多课程,属于很多班级。
  • 班级有很多学生,属于很多学生。

    在这里,学生和班级直接相互关联。学生们通常会参加许多课程,如物理,化学等 - 所以他们有很多课程。由于每节课都参加,因此学生属于许多班级。 同样,许多学生都会上课 - 所以上课有很多学生。由于每个学生都有出勤率,因此班级属于很多学生。

注意:

  1. 如果两个班级通过像约会这样的干预模式与多对多关系相关,那么请使用hasManyThrough。
  2. 如果两个类与多对多关系直接相关,请使用hasAndBelongsToMany

答案 1 :(得分:2)

hasManyThrough只是一个hasMany关系,已定义了直通模型。请参阅https://github.com/strongloop/loopback-datasource-juggler/blob/4c9e91423f3d356bb544790075dcb7f891450096/lib/relation-definition.js#L659中的params.through

hasAndBelongsToMany本质上是在双方设置hasManyThrough关系的快捷方式。如果尚未定义through模型,则它只是连接两个模型名称并尝试按该名称查找模型,如果失败则只尝试从该名称获取表中的关系(https://github.com/strongloop/loopback-datasource-juggler/blob/4c9e91423f3d356bb544790075dcb7f891450096/lib/relation-definition.js#L1630

如果您在hasAndBelongsToManyAssembly之间定义Part关系,则会在hasManybelongsTo之间设置AssemblyAssemblyPart关系{1}}以及Part和AssemblyPart之间的另一对。如果没有定义AssemblyPart模型,它只会尝试使用一个名为assemblypart的表(或者我猜是否MongoDB,我主要是一个RDBMS人)。它还将定义从hasManyThroughAssembly的{​​{1}}关系,使用Part作为直通模型(以便AssemblyPart可用)及其assembly.parts对应关系Part 1}}到Assemblypart.assemblies)。

我想说的是,您可以通过手动定义hasAndBelongsToMany模型并使用相应的AssemblyParthasMany来与belongsTo完全相同AssemblyPart模型以及两个hasManyThrough:从AssemblyPart以及从PartAssembly