Sequelize 关系模型简介

先介绍一下本文用到的术语:

: 调用 sequelize 中关系方法的调用者

目标: 调用 sequelize 中关系方法中的参数

比如, User.hasOne(Project), 其中 User 是源, Project 是目标.

一对一关系

一对一关系通过单个外键连接两个模型.

BelongsTo

belongsTo 方法添加一对一关系外键到源模型上.

var Player = this.sequelize.define('player', {/* attributes */})
, Team = this.sequelize.define('team', {/* attributes */}); // 添加 teamId foreign key 到 Player
Player.belongsTo(Team);

Sequelize 自动添加目标名+目标主键作为源的外键, 并且以 camelCase 表示外键名

var User = this.sequelize.define('user', {/* attributes */})
, Company = this.sequelize.define('company', {/* attributes */}); User.belongsTo(Company); // Will add companyId to user // 可以通过指定主键和配置参数来修改生成的外键名
var User = this.sequelize.define('user', {/* attributes */}, {underscored: true})
, Company = this.sequelize.define('company', {
uuid: {
type: Sequelize.UUID,
primaryKey: true
}
}); User.belongsTo(Company); // Will add company_uuid to user // 也可以在定义关系时直接指定外键名
var User = this.sequelize.define('user', {/* attributes */})
, Company = this.sequelize.define('company', {/* attributes */}); User.belongsTo(Company, {foreignKey: 'fk_company'}); // Adds fk_company to User // 也可以指定目标的键作为源的外键
var User = this.sequelize.define('user', {/* attributes */})
, Company = this.sequelize.define('company', {/* attributes */}); User.belongsTo(Company, {foreignKey: 'fk_companyname', targetKey: 'name'}); // Adds fk_companyname to User

HasOne

hasOne 方法添加一对一关系外键到目标模型上.

var User = sequelize.define('user', {/* ... */})
var Project = sequelize.define('project', {/* ... */}) // 一对一关系
Project.hasOne(User) /*
下例中 hasOne 会添加 projectId 到 User 模型中.
同时, Project.prototype 会添加 getUser 和 setUser 方法
*/ Project.hasOne(User, { foreignKey: 'initiator_id' }) /*
通过 as 可以修改 getter 和 setter 的名字,
下例中, Project.prototype 会添加 getInitiator 和 setInitiator 方法,
而不是 getUser 和 setUser.
*/ Project.hasOne(User, { as: 'Initiator' }) // 这样就能定义自引用
var Person = sequelize.define('person', { /* ... */}) Person.hasOne(Person, {as: 'Father'})
// 添加 FatherId 到 Person // 也可以:
Person.hasOne(Person, {as: 'Father', foreignKey: 'DadId'})
// 添加 DadId 到 Person // 两种情况都可以调用 getFather 和 setFather // If you need to join a table twice you can double join the same table
Team.hasOne(Game, {as: 'HomeTeam', foreignKey : 'homeTeamId'});
Team.hasOne(Game, {as: 'AwayTeam', foreignKey : 'awayTeamId'}); Game.belongsTo(Team);

一对多关系

一对多关系连接一个源到多个目标.

var User = sequelize.define('user', {/* ... */})
var Project = sequelize.define('project', {/* ... */}) // 定义一(Project)对多(User)关系,
Project.hasMany(User, {as: 'Workers'})
// 添加 projectId 到 User,
// Project.prototype 添加 getWorkers 和 setWorkers.

belongsToMany

belongsToMany 方法用于多对多关系.

Project.belongsToMany(User, {through: 'UserProject'});
User.belongsToMany(Project, {through: 'UserProject'});

上例中会新建 UserProject 模型, 拥有两个外键 userIdprojectId.

定义多对多关系时必须指定 through 属性.

Sequelize 关系模型简介的更多相关文章

  1. 转:概率主题模型简介 --- ---David M. Blei所写的《Introduction to Probabilistic Topic Models》的译文

    概率主题模型简介 Introduction to Probabilistic Topic Models      转:http://www.cnblogs.com/siegfang/archive/2 ...

  2. ORM模型简介

    ORM模型简介 1>什么是ORM? ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 ...

  3. spring 事件驱动模型简介

    事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型:理解它的几个关键点: 首先是一种对象间的一对多的关系:最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方): ...

  4. SNF快速开发平台2019-权限管理模型简介-权限都在这里

    1.1    权限的概念 权限是指为了保证职责的有效履行,任职者必须具备的,对某事项进行决策的范围和程度.它常常用“具有批准……事项的权限”来进行表达.例如,具有批准预算外5000元以内的礼品费支出的 ...

  5. css盒模型简介

    如何了解盒模型 盒模型简介:盒模型是css布局的基石,它规定了网页元素如何显示以及元素间相互关系.css定义所有的元素都可以拥有像盒子一样的外形和平面空间. 盒模型的组成:内容区.补白/填充.边框.边 ...

  6. 数据库精华知识点总结(1)—数据库的三层模式和二级映像,E-R(实体联系图)图,关系模型

    Data base: 长期存储在计算机内,有组织的,可共享的大量数据集合.基本特征:永久存储,可共享,有一定的物理和逻辑结构. Data base manage system(DBMS):用户和os之 ...

  7. 数据库系统原理——ER模型与关系模型

    原文链接: http://blog.csdn.net/haovip123/article/details/21614887 犹记得第一次看<数据库系统原理>时看天书的感觉,云里雾里:现在已 ...

  8. ER模型到关系模型的转换规则

    E-R模型向关系模型的转换规则: 一.两元联系的转换规则 (1)实体类型的转换 将每个实体类型转换成一个关系模式,实体的属性即为关系的属性,实体标识符即为关系的键. (2)联系类型的转换 a实体间的联 ...

  9. 分享一个自己写的基于TP的关系模型

    为了说明问题,假设现在有表test1,test1有从表test2:test1属于test3,test1和test4多对多,关联表test1_test4. 1.定义关系 class Test1Model ...

随机推荐

  1. 简易c语言文法

    <程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...

  2. 树莓派(Raspberry Pi)日期时间不准的修正方法

    在树莓派上,打date命令可以看到系统的日期时间: 后面的CST表示中国标准时间 小知识: 树莓派没有电池,断电后无法保存时间. 树莓派默认安装了NTP(Network Time Protocol)服 ...

  3. Winform水印

    本文实例展示了WinForm实现为TextBox设置水印文字功能,非常实用的技巧,分享给大家供大家参考. 关键代码如下 using System; using System.Runtime.Inter ...

  4. css预处理语言的模块化实践

    编写css是前端工作中,一项普通而又频繁的劳动,由于css并不是一门语言,所以在程序设计上显得有些简陋.对于小型项目来说,css的量还不至于庞大,问题没有凸显,而如果要开发和持续维护一个较为大型的项目 ...

  5. cPage分页详细介绍

    asp.net中各种数据控件,datalist.gridview.Repeater等分页是最常用的功能,几乎任何一个B/S项目,无论是系统还是网站都会用到.分页时,读取整个数据,直接绑定到控件,都可以 ...

  6. winform中button点击后再点击其他控件致使button失去焦点,此时button出现黑色边线,去掉黑色边线的方法

    winform中button点击后再点击其他控件致使button失去焦点,此时button出现黑色边线,去掉黑色边线的方法 button的FlatAppearence属性下,设置BorderSize= ...

  7. [LeetCode] 10. Regular Expression Matching

    Implement regular expression matching with support for '.' and '*'. DP: public class Solution { publ ...

  8. rails下react的demo

    gemfile gem 'react-rails' gen一下 react:install 创建组件 react:component MyComponent name:string age:int v ...

  9. Install CentOS 7 on Thinkpad t430

    - BIOS settings: - Thinkpadt430, BIOS settings: Config---------------------------- Network: wake on ...

  10. aar引用 no executable code found问题

    主工程中 repositories { flatDir { dirs project(':trade_module').file('libs') }} dependencies { compile f ...