orm2 中文文档 4.2 hasMany(多对多关系)

简介: 译者:飞龙 来源:hasManyhasMany是多对多的关系(包括连接表)。例如:Patient.hasMany('doctors', Doctor, { why: String }, { reverse: 'patients', key: true })。

译者:飞龙

来源:hasMany

hasMany

是多对多的关系(包括连接表)。

例如:Patient.hasMany('doctors', Doctor, { why: String }, { reverse: 'patients', key: true })

病人可以拥有许多不同的医生。每个医生可以拥有许多不同的病人。

当你调用Patient.sync()时,会创建一个连接表patient_doctors

列名称 类型
patient_id Integer
doctor_id Integer
why varchar(255)

下列函数是可用的:

// 获取所有关联医生的列表
patient.getDoctors(function(err, doctors) {
  // ...
});

// 向连接表中增加记录
patient.addDoctors([phil, bob], function(err) {
  // ...
});

// 移除连接表中的现有记录,并增加新的
patient.setDoctors([phil, nephewOfBob], function(err) {
  // ...
});

// 检查是否某个病人关联了指定的医生
patient.hasDoctors([bob], function(err, patientHasBobAsADoctor) {
  // because that is a totally legit and descriptive variable name
  if (patientHasBobAsADoctor) {
    // ...
  } else {
    // ...
  }
});

// 从连接表中移除指定记录
patient.removeDoctors([bob], function(err) {
  // ...
});

// 并且所有医生都有自己的方法来获取病人
bob.getPatients(function(err, patients) {
  if (patients.indexOf(you) !== -1) {
    // woot!
  } else {
    // ...
  }
});

// 以及其他

要把医生关联到病人:

patient.addDoctor(surgeon, {why: 'remove appendix'}, function(err) {
  // ...
});

// or...
surgeon.addPatient(patient, {why: 'remove appendix'}, function(err) {
  // ...
});

这样会添加{patient_id: 4, doctor_id: 6, why: "remove appendix"}到连接表中。

API

Model.hasMany(
  name,       // String. 关联名称
  otherModel, // Model. 要关联的模型
  extraProps, // Object. 在连接表上出现的额外属性
  opts        // Object. 关联的选项
);

选项

选项名称 类型 描述
autoFetch Boolean 默认为false。如果为true,关联将会自动被获取。
autoFetchLimit Number 默认为1。自动获取的深度。
key Boolean 默认为false(由于历史原因)。如果为true,表中外键的列会形成一个组合键。
mergeTable String 连接表的自定义名称
mergeId String 代表当前模型那一列的自定义名称
mergeAssocId String 代表另一个模型那一列的自定义名称
reverse String 默认为false。如果为true,关联可以通过另一个模型使用指定方法获取到。
getAccessor String 默认为'get' + Name。允许重命名关联访问器。
setAccessor String 默认为'set' + Name。允许重命名关联访问器。
hasAccessor String 默认为'has' + Name。允许重命名关联访问器。
delAccessor String 默认为'del' + Name。允许重命名关联访问器。
addAccessor String 默认为'add' + Name。允许重命名关联访问器。
相关文章
|
1天前
|
Python
使用Django时,如何设计模型关系(一对一、一对多、多对多)?
Django支持三种模型关联:ForeignKey(一对多),OneToOneField(一对一)和ManyToManyField(多对多)。ForeignKey示例:`Article`有一个指向`Author`的外键。OneToOneField示例:`UserProfile`与`User`一对一关联。ManyToManyField示例:`Student`和`Course`之间多对多关系。这些关联字段便于反向查询,如`article.author`获取作者,`author.article_set.all()`获取作者所有文章。
6 1
|
9月前
|
Python
【Django实战】创建多对多关系表的三种模式及优缺点分析
【Django实战】创建多对多关系表的三种模式及优缺点分析
|
SQL 架构师 Java
SpringBoot从入门到精通(二十八) JPA 的实体映射关系,轻松一对一,一对多,多对多关系映射!
前面讲了Spring Boot 使用 JPA,实现JPA 的增、删、改、查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用。JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层和sql语句即可实现完整的数据操作方法。但是,之前都是介绍的单表的增删改查等操作,多表多实体的数据操作怎么实现呢?接下来聊一聊 JPA 的一对一,一对多,多对一,多对多等实体映射关系。
SpringBoot从入门到精通(二十八) JPA 的实体映射关系,轻松一对一,一对多,多对多关系映射!
|
数据库 Python
Flask学习与项目实战7:一对一关系、管理表的映射与ORM、项目重构
上篇文章中提到了一对多关系, 也就是一个user对应多篇文章,这是一对多的关系,那么如何设置一对一的关系呢。
Flask学习与项目实战7:一对一关系、管理表的映射与ORM、项目重构
|
SQL Java 数据库连接
Mybatis如何实现一对多或多对一的ORM映射呢?
Mybatis如何实现一对多或多对一的ORM映射呢?
121 0
|
存储 关系型数据库 数据库
[译] 如何用 Room 处理一对一,一对多,多对多关系?
[译] 如何用 Room 处理一对一,一对多,多对多关系?
[译] 如何用 Room 处理一对一,一对多,多对多关系?
|
测试技术 数据库
Grails里DOMAIN类的一对一,一对多,多对多关系总结及集成测试
终于干完这一章节,收获很多啊。 和DJANGO有类似,也有不同。 User.groovy: package com.grailsinaction class User { String loginId String password Date dat...
1240 0
|
存储 Java 数据库连接
Hibernte的多对多映射(十二)
Hibernte的多对多映射(十二)
Hibernte的多对多映射(十二)
|
SQL Java 测试技术
SpringBoot从入门到精通(二十八)JPA 的实体映射关系,一对一,一对多,多对多关系映射!
前面讲了Spring Boot 使用 JPA,实现JPA 的增、删、改、查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用。JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层和sql语句即可实现完整的数据操作方法。但是,之前都是介绍的单表的增删改查等操作,多表多实体的数据操作怎么实现呢?接下来聊一聊 JPA 的一对一,一对多,多对一,多对多等实体映射关系。
SpringBoot从入门到精通(二十八)JPA 的实体映射关系,一对一,一对多,多对多关系映射!