Make great things

What I cannot create, I do not understand.

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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  阅读(2624)  评论(0编辑  收藏  举报