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。允许重命名关联访问器。
相关文章
|
人工智能 自然语言处理 运维
AIGC系列文章汇总
AIGC系列文章汇总(2024年3月8日更新)
3380 4
AIGC系列文章汇总
|
机器学习/深度学习 PyTorch 测试技术
|
存储 索引 Python
哈希表是怎么删除元素的,能直接删除吗?
哈希表是怎么删除元素的,能直接删除吗?
283 3
|
8月前
|
人工智能 Java API
Spring AI与DeepSeek实战一:快速打造智能对话应用
在 AI 技术蓬勃发展的今天,国产大模型DeepSeek凭借其低成本高性能的特点,成为企业智能化转型的热门选择。而Spring AI作为 Java 生态的 AI 集成框架,通过统一API、简化配置等特性,让开发者无需深入底层即可快速调用各类 AI 服务。本文将手把手教你通过spring-ai集成DeepSeek接口实现普通对话与流式对话功能,助力你的Java应用轻松接入 AI 能力!虽然通过Spring AI能够快速完成DeepSeek大模型与。
1205 11
|
监控 算法 Java
深入解析Java中的垃圾回收机制
本文旨在全面解析Java的垃圾回收机制,探讨其工作原理、常见算法以及在实际开发中的应用。通过对这一重要主题的深入分析,希望帮助读者更好地理解Java虚拟机(JVM)如何管理内存,从而编写出更高效、稳定的Java应用程序。
|
11月前
|
Java 物联网 程序员
还在纠结抽象类和接口?看这篇就够了!
本文从一位程序员的角度出发,讲述了其小学弟在Java开发面试中遇到的难题——抽象类与接口的区别。文章不仅详细解析了两者的定义、特点及主要差异,还提供了实际开发中的应用场景和面试答题技巧,帮助读者更好地理解和应用这一重要知识点。
1615 12
|
存储 人工智能 算法
精通RAG架构:从0到1,基于LLM+RAG构建生产级企业知识库
为了帮助更多人掌握大模型技术,尼恩和他的团队编写了《LLM大模型学习圣经》系列文档,包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构,基于LLM+RAG构建生产级企业知识库》和《从0到1吃透大模型的顶级架构》。这些文档不仅系统地讲解了大模型的核心技术,还提供了实战案例和配套视频,帮助读者快速上手。
精通RAG架构:从0到1,基于LLM+RAG构建生产级企业知识库
|
人工智能 安全
我国AIGC的监管态势
【1月更文挑战第21天】我国AIGC的监管态势
296 4
我国AIGC的监管态势
|
人工智能 安全
美欧AIGC监管政策对比
【1月更文挑战第10天】美欧AIGC监管政策对比
513 1
美欧AIGC监管政策对比
|
安全 Java 数据库
第4章 Spring Security 的授权与角色管理(2024 最新版)(上)
第4章 Spring Security 的授权与角色管理(2024 最新版)
734 0