Sequelize 关系模型简介
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 模型, 拥有两个外键 userId 和 projectId.
定义多对多关系时必须指定 through 属性.
Sequelize 关系模型简介的更多相关文章
- 转:概率主题模型简介 --- ---David M. Blei所写的《Introduction to Probabilistic Topic Models》的译文
概率主题模型简介 Introduction to Probabilistic Topic Models 转:http://www.cnblogs.com/siegfang/archive/2 ...
- ORM模型简介
ORM模型简介 1>什么是ORM? ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 ...
- spring 事件驱动模型简介
事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型:理解它的几个关键点: 首先是一种对象间的一对多的关系:最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方): ...
- SNF快速开发平台2019-权限管理模型简介-权限都在这里
1.1 权限的概念 权限是指为了保证职责的有效履行,任职者必须具备的,对某事项进行决策的范围和程度.它常常用“具有批准……事项的权限”来进行表达.例如,具有批准预算外5000元以内的礼品费支出的 ...
- css盒模型简介
如何了解盒模型 盒模型简介:盒模型是css布局的基石,它规定了网页元素如何显示以及元素间相互关系.css定义所有的元素都可以拥有像盒子一样的外形和平面空间. 盒模型的组成:内容区.补白/填充.边框.边 ...
- 数据库精华知识点总结(1)—数据库的三层模式和二级映像,E-R(实体联系图)图,关系模型
Data base: 长期存储在计算机内,有组织的,可共享的大量数据集合.基本特征:永久存储,可共享,有一定的物理和逻辑结构. Data base manage system(DBMS):用户和os之 ...
- 数据库系统原理——ER模型与关系模型
原文链接: http://blog.csdn.net/haovip123/article/details/21614887 犹记得第一次看<数据库系统原理>时看天书的感觉,云里雾里:现在已 ...
- ER模型到关系模型的转换规则
E-R模型向关系模型的转换规则: 一.两元联系的转换规则 (1)实体类型的转换 将每个实体类型转换成一个关系模式,实体的属性即为关系的属性,实体标识符即为关系的键. (2)联系类型的转换 a实体间的联 ...
- 分享一个自己写的基于TP的关系模型
为了说明问题,假设现在有表test1,test1有从表test2:test1属于test3,test1和test4多对多,关联表test1_test4. 1.定义关系 class Test1Model ...
随机推荐
- [java]wordcount程序
词数统计系统. 作业解析:这次作业的内容是从本地读取一个程序代码,计算出这个程序中的行数,单词数,也可进行拓展. 实现语言:java 编程思路: 程序是由各种单词和符号组成的,单词包括关键字,标识符这 ...
- unity 内存中切割图片
一般的说我们切割图片是将一张图片资源切割成更小的图片资源,也就是说在资源上就进行了切割,比如ugui上的切割方法. 如果我们有一些情况比如做拼图,可能让玩家自己选择自己的生活照作为拼图的原图. 那么我 ...
- linux根文件系统制作
在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误. 那么根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0挂载,而后执行/l ...
- php lock_sh共享锁 与 lock_ex排他锁
参考网站:http://hi.baidu.com/honly1215/item/8d27a66d11689c3aac3e83fe 文件锁有两种:共享锁和排他锁,也就是读锁(LOCK_SH)和写锁(LO ...
- Base64编码及其作用
Base64编码的作用:由于某些系统中只能使用ASCII字符.Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法.它使用下面表中所使用的字符与编码. 而且base64特别适合在 ...
- int.Parse()、int.TryParse()和Convert.ToInt32()的区别
1:int.Parse(一个参数) 此参数必须满足: 1 只能是字符串: 2 只能是 “整型” 字符串,即各种整型ToString()之后的形式,也不能为浮点型. 2:int.TryPa ...
- getview不执行
<FrameLayout android:layout_width="match_parent" android:layout_height="match_pare ...
- JS 进制转换
十进制转换成其他进制 objectname.toString([radix]) objectname 必选项.要得到字符串表示的对象. radix 可选项.指定将数字值转换为字符串时的进制. 例如 ...
- 一样的alert代码,样式不同
function windowLoaded(e) { alert('dede3');} window.onload=windowloaded; 的结果如下 而window.addEventlisten ...
- [PHP] - PDO事务操作
PHP使用PDO事务操作数据库. 参考文章: http://php.ncong.com/mysql/pdo/pdo_shiwu.html 上代码: <!doctype html> < ...