sequelize.js - 如何在与首先创建的一个表中的记录关联的表中实例化?
问题描述
我有两张桌子,一张存储用户,另一张存储他们在拍卖中给出的发布。在表格代码的发送下方:
const dadosusers = conecao.define('usuarios', {
nomecompleto: {
type: sequelize.STRING,
},
nomeusuario: {
type: sequelize.STRING
},
senha: {
type: sequelize.STRING
},
datanascimento: {
type: sequelize.DATE
},
rg: {
type: sequelize.STRING
},
cpf: {
type: sequelize.STRING
},
sexo:{
type: sequelize.STRING
},
telefone: {
type: sequelize.STRING
},
email: {
type: sequelize.STRING,
allowNull: false,
unique: true
},
emailrecuperacao: {
type: sequelize.STRING
},
estado: {
type: sequelize.STRING
},
cep: {
type: sequelize.STRING
},
cidade: {
type: sequelize.STRING
},
logradouro: {
type: sequelize.STRING
},
numerocasa: {
type: sequelize.INTEGER
},
complemento: {
type: sequelize.STRING
},
statuscadastro: {
type: sequelize.STRING
}
});
dadosusers.sync({force: 'true'});
module.exports = dadosusers
E a tabela onde ficara os lance é:
const dadoslances = conecao.define("dadoslances", {
lance: {
type: Sequelize.STRING,
unique: true
},
ofertante: {
type: Sequelize.STRING
},
ncurtidas: {
type: Sequelize.INTEGER
},
statuslance: {
type: Sequelize.STRING
},
modalrel: {
type: Sequelize.STRING
},
datacriacao: {
type: Sequelize.DATE
}
});
dadosuser.hasMany(dadoslances, {foreignKey: "lanceId"} );
dadoslances.sync({force: 'true'})
module.exports = dadoslances
我可以使用简单的 Model.create 创建记录,例如:
usuarios.create({
nomecompleto: "James Silver",
email: "james@gmail.com
})
但我无法异步创建出价,因为用户实例是首先在网站上创建的。在尝试为用户“james”创建出价时,我尝试了以下操作:
const id = usuarios.findAll({
attributes: ["id"],
where: {
email: "james@gmail.com"
}).then(function(res){
return res
})
dadoslances.create({
lanceId: id,
lance: "$ 500.00"
})
但是我尝试的结果将“lanceId”列返回为 Null。这里的想法是用户将首先在平台上注册,然后每个用户都可以出价购买对象,这就是为什么出价不会与用户同时实例化的原因。如果有人可以帮助我,我的问题是如何在关联表中异步创建实例。
解决方案
方法一
usuarios.findOne({ // you can use findOne instead of findAll: if email is primary key
attributes: ["id"],
where: {
email: "james@gmail.com"
}
}).then(function (res) {
// 'res' is the usuarios record
dadoslances.create({
lanceId: res.id,
lance: "$ 500.00"
})
return res
})
方法2
const usuariosList = await usuarios.findAll({ // we need use await to use 'idList'
attributes: ["id"],
where: {
email: "james@gmail.com"
}
}); //No need ".then( ... )"
if(usuariosList.length > 0) { // findAll return list, so, must use `[0]`
dadoslances.create({
lanceId: usuariosList[0].id,
lance: "$ 500.00"
})
}