如何在Sequelize bulkCreate中关联已存在的belongsTo模型?
问题:Sequelize批量创建用户时如何通过关联对象设置belongsTo关联?
我有两个模型:Role和User,它们的关联关系为Role has many Users、User belongs to Role。单独创建用户后调用setRole设置角色可以正常工作,但批量创建用户并关联特定角色对象时,要么不添加include参数导致外键列为空,要么添加include后Sequelize尝试插入新角色而非关联已存在的角色。
请问能否在bulkCreate的对象数组中通过关联模型对象来设置belongsTo关联,而非直接设置ID?
Role 模型代码
class Role extends Model { static associate(models) { this.hasMany(models.User); } } Role.init({ name: DataTypes.STRING, level: DataTypes.SMALLINT.UNSIGNED, unrestricted: DataTypes.BOOLEAN, preferences: DataTypes.TEXT }, { sequelize: getSequelizeInstance(), modelName: 'Role', timestamps: true });
User 模型代码
class User extends Model { static associate(models) { this.belongsTo(models.Role); } } User.init({ name: DataTypes.STRING, username: { type: DataTypes.STRING, unique: true }, password: DataTypes.STRING, refreshToken: DataTypes.STRING }, { sequelize: getSequelizeInstance(), modelName: 'User', timestamps: true, scopes: { withoutSecrets: { attributes: { exclude: ['password', 'refreshToken'] }, } } });
插入角色数据
await Role.bulkCreate([ { name: 'Dev', level: 0, unrestricted: true }, { name: 'Admin', level: 1, unrestricted: false }, { name: 'User', level: 2, unrestricted: false }, ]);
单个创建用户并关联角色(可行)
const roles = await Role.findAll(); const user = await User.create({ name: 'Dev', username: 'dev', password: await hashPassword('123456') }); await user.setRole(roles.find(role => role.dataValues.name === 'Dev'));
批量创建用户并关联角色(触发错误)
const roles = await Role.findAll(); await User.bulkCreate([ { name: 'Dev', username: 'dev', password: await hashPassword('123456'), Role: roles.find(role => role.dataValues.name === 'Dev') }, { name: 'Admin', username: 'admin', password: await hashPassword('123456'), Role: roles.find(role => role.dataValues.name === 'Admin') }, { name: 'User', username: 'user', password: await hashPassword('123456'), Role: roles.find(role => role.dataValues.name === 'User') }, ], { include: Role });
执行的查询语句:
Executing (default): SELECT `id`, `name`, `level`, `unrestricted`, `preferences`, `createdAt`, `updatedAt` FROM `Roles` AS `Role`; Executing (default): INSERT INTO `Roles` (`id`,`name`,`level`,`unrestricted`,`preferences`,`createdAt`,`updatedAt`) VALUES (1,'Dev',0,true,NULL,'2023-03-27 19:01:22','2023-03-27 19:01:22'),(2,'Admin',1,false,NULL,'2023-03-27 19:01:22','2023-03-27 19:01:22'),(3,'User',2,false,NULL,'2023-03-27 19:01:22','2023-03-27 19:01:22');
错误信息:
ERROR: Validation error
使用版本:Node: 16.19.0, CLI: 6.6.0, ORM: 6.29.3
内容的提问来源于stack exchange,提问作者Samik Sengupta
相关产品推荐
相关产品推荐

