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 屬性.
