这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战
1.模型的关联关系
关联关系分别是一对一, 一对多, 多对多
- 一对一, 使用
hasOne和belongsTo方法 - 一对多, 使用
hasMany和belongsTo方法 - 多对多, 使用
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'
});
可用的参数为 RESTRICT, CASCADE, NO ACTION, SET DEFAULT 和 SET NULL.
一对一关联的默认值, ON DELETE 为 SET NULL 而 ON UPDATE 为 CASCADE.
自定义外键
foreignKey 参数接受一个字符串或一个对象. 当接收到一个对象时,该对象将用作列的定义,就像在标准的 sequelize.define 调用中所做的一样. 因此,指定诸如 type, allowNull, defaultValue 等参数就可以了
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