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 模型, 拥有两个外键 userIdprojectId.
定义多对多关系时必须指定 through 属性.

posted on 2016-10-01 10:10 wbin91 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/wbin91/p/5925489.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值