NodeJS的sequelize的模型表的关联

651 阅读2分钟

这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

1.模型的关联关系

关联关系分别是一对一, 一对多, 多对多

  1. 一对一, 使用hasOne 和 belongsTo 方法
  2. 一对多, 使用hasMany 和 belongsTo 方法
  3. 多对多, 使用 belongsToMany 方法

2.定义 Sequelize 关联

例子

const A = sequelize.define('A', /* ... */);
const B = sequelize.define('B', /* ... */);

A.hasOne(B); // A 有一个 B
A.belongsTo(B); // A 属于 B
A.hasMany(B); // A 有多个 B
A.belongsToMany(B, { through: 'C' }); // A 属于多个 B , 通过联结表 C

hasOne, belongsTo, hasMany, belongsToMany接受一个对象作为第二个参数(前三个参数是可选的,而对于包含 through 属性的 belongsToMany 是必需的)

A.hasOne(B, { /* 参数 */ });
A.belongsTo(B, { /* 参数 */ });
A.hasMany(B, { /* 参数 */ });
A.belongsToMany(B, { through: 'C', /* 参数 */ });

3.关联关系介绍

3.1.一对一关系

可以将各种参数作为关联调用的第二个参数传递, onDelete 和 onUpdate

Foo.hasOne(Bar, {
  onDelete: 'RESTRICT',
  onUpdate: 'RESTRICT'
});

可用的参数为 RESTRICTCASCADENO ACTIONSET DEFAULT 和 SET NULL. 一对一关联的默认值, ON DELETE 为 SET NULL 而 ON UPDATE 为 CASCADE.

自定义外键

foreignKey 参数接受一个字符串或一个对象. 当接收到一个对象时,该对象将用作列的定义,就像在标准的 sequelize.define 调用中所做的一样. 因此,指定诸如 typeallowNulldefaultValue 等参数就可以了

const { DataTypes } = require("Sequelize");

Foo.hasOne(Bar, {
  foreignKey: {
    // name: 'myFooId'
    type: DataTypes.UUID
  }
});
Bar.belongsTo(Foo);

强制性与可选性关联

默认情况下,该关联被视为可选,fooId 允许为空,这意味着一个 Bar 可以不存在 Foo 而存在. 只需在外键选项中指定 allowNull: false 即可更改此设置:

Foo.hasOne(Bar, {
  foreignKey: {
    allowNull: false
  }
});

3.2.一对多关系

一个团队有多个玩家 ,而每个玩家都属于一个团队

Team.hasMany(Player);
Player.belongsTo(Team);

强制性更改外键的名称,像一对一关系一样, ON DELETE 默认为 SET NULL 而 ON UPDATE 默认为 CASCADE

Team.hasMany(Player, {
  foreignKey: 'clubId'
});
Player.belongsTo(Team);

3.3.多对多关系

一位演员参加多部电影,一部电影多位演员参加,生成的外键 movieId 和 actorId

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' });

与一对一和一对多关系不同,对于多对多关系,ON UPDATE 和 ON DELETE 的默认值为 CASCADE