我正在使用 Sequelize version 5作为我的 ORM,定义了 User 和 Profile 模型。两个模型之间存在一对一的关系,我希望在创建用户时自动创建配置文件。我怎样才能做到这一点?我的模型定义如下:
用户.js
'use strict';
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define(
'User',
{
name: DataTypes.STRING,
username: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING,
},
{}
);
User.associate = function (models) {
User.hasOne(models.Profile);
};
return User;
};
profile.js
'use strict';
module.exports = (sequelize, DataTypes) => {
const Profile = sequelize.define(
'Profile',
{
location: DataTypes.STRING,
websiteUrl: DataTypes.STRING,
bio: DataTypes.TEXT,
userId: DataTypes.INTEGER,
},
{}
);
Profile.associate = function (models) {
Profile.belongsTo(models.User);
};
return Profile;
};
我也有以下迁移:
用户迁移
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
name: {
type: Sequelize.STRING
},
username: {
type: Sequelize.STRING
},
email: {
type: Sequelize.STRING
},
password: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Users');
}
};
配置文件迁移
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Profiles', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER,
},
location: {
type: Sequelize.STRING,
},
websiteUrl: {
type: Sequelize.STRING,
},
bio: {
type: Sequelize.TEXT,
},
userId: {
type: Sequelize.INTEGER,
references: {
model: 'Users',
key: 'id',
},
},
createdAt: {
allowNull: false,
type: Sequelize.DATE,
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
},
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Profiles');
},
};
最佳答案
您可以创建a hook您在其中定义配置文件的创建。
您也可以尝试使用Special Mixins可从关系中获得
Hook 方法:
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define(
'User',
{
name: DataTypes.STRING,
username: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING,
},
{
hooks: {
afterCreate(user, options) => {
Profile.create({userId: user.id)
}
}
}
);
User.associate = function (models) {
User.hasOne(models.Profile);
};
return User;
};
Mixin 方法
const user = await User.create({...userData});
const profile = await User.createProfile({userId: user.id, ...profileData});
关于node.js - 当使用 Sequelize.js 创建另一条记录时,如何在数据库中自动创建一条新记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61311568/