使用Sequelize模块操作数据库之模型的关联

在之前我们了解了模型的创建,模型是代表数据库中表的抽象,而在数据库库的表中,我们可以给表设置关联,所以我们也可以通过模型完成这些关联的创建。

在数据库中标准关联关系有:一对一、一对多、多对多。而Sequelize模块都可以实现,Sequelize模块提供了四种关联类型,将他们组合在一起可以创建关联:

  1. HasOne 关联类型:A.hasOne(B) 关联意味着 A 和 B 之间存在一对一的关系,外键在目标模型(B)中定义.
  2. BelongsTo 关联类型:A.belongsTo(B)关联意味着 A 和 B 之间存在一对一的关系,外键在源模型中定义(A).
  3. HasMany 关联类型:A.hasMany(B) 关联意味着 A 和 B 之间存在一对多关系,外键在目标模型(B)中定义.
  4. BelongsToMany 关联类型:A.belongsToMany(B, { through: ‘C’ }) 关联意味着将表 C 用作联结表,在 A 和 B 之间存在多对多关系

综合对关联类型的定义,可以得出:

  1. 创建一个 一对一 关系, hasOne 和 belongsTo 关联一起使用;
  2. 创建一个 一对多 关系, hasMany he belongsTo 关联一起使用;
  3. 创建一个 多对多 关系, 两个 belongsToMany 调用一起使用

一对一关系

在创建一对一关系时,我们必须通过hasOne 和 belongsTo 关联一起使用。 HasOne 在 目标模型中插入关联键, belongsTo 在 源模型中插入关联键。(参数被称为目标模型,调用关联的为源模型)。下列为创建一对一关系的方式:

外键名默认为表名+主键名
const Player = this.sequelize.define('player', {/* attributes */});
const Team  = this.sequelize.define('team', {/* attributes */});

Player.belongsTo(Team); // 将向 Player 添加一个 teamId 属性以保存 Team 的主键值
Team.hasOne(Player); // 将向 Player 添加一个 teamId 属性以保存 Team 的主键值

Player.belongsTo(Team);Team.hasOne(Player);,所表达的意思是一样的。在创建一对一关系中必须同时使用 HasOne 和 BelongsTo 进行设置。

在创建过程中可以给关联传递参数,onDelete和onUpdate分别表示删除时、修改时执行什么操作,默认为SET NULLCASCADE,可选参数为RESTRICT, CASCADE, NO ACTION, SET DEFAULTSET NULL

Player.belongsTo(Team,{
  onDelete: 'RESTRICT',
  onUpdate: 'RESTRICT'
});
Team.hasOne(Player);

一对多

在创建一对多关系时,我们必须通过hasMany 和 belongsTo 关联一起使用。

const Player = this.sequelize.define('player', {/* attributes */});
const Team  = this.sequelize.define('team', {/* attributes */});
Player .hasMany(Team  );
Team  .belongsTo(Player );

必须同时使用 hasMany 和 belongsTo 来创建一对多关系。参数部分同一对一关系所示。

多对多关系

在创建一对多关系时,我们必须通过两个 belongsToMany 关联一起使用。

const Movie = sequelize.define('Movie', { name: DataTypes.STRING });
const Actor = sequelize.define('Actor', { name: DataTypes.STRING });
Movie.belongsToMany(Actor, { through: 'ActorMovies' });
Actor.belongsToMany(Movie, { through: 'ActorMovies' });

这将创建一个名为 ActorMovies的新模型,具有等效的外键 movieId 和actorId。

关联别名 & 自定义外键

在上面所以实例中,Sequelize 自动定义了外键名称。有三种方法可以为外键指定不同的名称:

  1. 通过直接提供外键名称
  2. 通过定义别名
  3. 通过两个方法同时进行
默认设置

在不指定任何值的时候,外键名称就是主键表表名+主键名,也可以通过通过给模型添加underscored: true配置项,则外键名称就是主键表表名_主键名

const User = this.sequelize.define('user', {/* attributes */}, {underscored: true})
const Company  = this.sequelize.define('company', {
  uuid: {
    type: Sequelize.UUID,
    primaryKey: true
  }
});

User.belongsTo(Company); // 将 company_uuid 添加到 user
直接提供外键名

通过 foreignKey 直接提供外键名,如下所示:

const User = this.sequelize.define('user', {/* attributes */})
const Company  = this.sequelize.define('company', {/* attributes */} );

User.belongsTo(Company,{ foreignKey: 'bossId' }); // 将 bossId添加到 user
定义别名

通过as 定义别名,外键名称就是别名+主键名

const User = this.sequelize.define('user', {/* attributes */})
const Company  = this.sequelize.define('company', {/* attributes */} );

User.belongsTo(Company,{ as: 'leader' }); // 将 leaderId添加到 user
两者都做

我们可以定义别名,也可以直接定义外键,但是这种情况下就以直接定义外键为主。

到此为止,模型关联部分就结束了,但是上述部分只是关联的小部分内容,更多内容需要自行去了解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值