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
属性.
keep learning