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. s2 devMode cmdshell

    s2 devMode cmdshell   仅支持批量验证,命令执行 链接:http://pan.baidu.com/s/1sl7tgRV 密码:wud8 也可以通过outscan一键获取,之后导入t ...

  2. 对tomcat中使用反射加载类的理解

    public void init() throws Exception { initClassLoaders(); //加载一下jar包和类 Thread.currentThread().setCon ...

  3. Quartz2D之生成圆形头像、打水印、截图三种方法的封装

    我给UIImage类添加了一个类目,用于封装三个方法,每个方法都没有难度,做这个主要为了练习一下封装: 首先在类目.h文件中声明三个方法:以及创建了一个枚举.用于水印方法中设定水印位置:方法说明和参数 ...

  4. DB2 claim与drain

    DB2使用claim & drain来控制SQL与utility对数据库对象的访问. claim说明有对象正在访问或是将要访问该对象,而drain则是在对象上面加一个drain lock,等所 ...

  5. iostat

    http://m.blog.csdn.net/article/details?id=43196731 http://blog.csdn.net/haiross/article/details/4319 ...

  6. 转:ADO.NET连接字符串

    名称 ADO.NET连接字符串 说明 ADO.NET连接字符串:SQL Server,SQL Server 2005,ACCESS,Oracle,MySQL,Interbase,IBM DB2,Syb ...

  7. wget: unable to resolve host address 解决办法

    vim /etc/resolv.conf 加上下面两句: nameserver 8.8.8.8 #google域名服务器nameserver 8.8.4.4 #google域名服务器

  8. tomcat解决加载JSP文件过大错误

    当遇到多个Jsp include一起的时候加载时遇到如下错误: Error:SEVERE: Servlet.service() for servlet jsp threw exception org. ...

  9. MyBatis学习(二)、SQL语句映射文件(1)resultMap

    二.SQL语句映射文件(1)resultMap SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyB ...

  10. makefile小例子

    makefile的知识点应该很多,看网上的很多教程就能看出来,长的可以写一本书.记录一下自己用的一个简单的makefile, 方便以后查找. 先看一下程序的目录结构: [root@localhost ...