假设存在两个模型,一个stu(学生)模型,一个score(分数)模型。那么如何添加在添加新学生的基础上同时添加该新学生的score。
1、将stu和score设置为score:stu = 1:1
方案1:有别称
models.Score.belongsTo(models.Stu, {
as: 'user',
foreignKey: 'userId',
targetKey: 'id'
});
models.Score.create({
user: {
name: '添加用户',
age: 50,
sex: '女',
},
projectName: '历史',
projectScore: '150'
}, {
raw: true,
include: [{
model: models.Stu,
as: 'user'
}]
}).then((res) =>{
console.log(JSON.stringify(res, null, 2))
}).catch((err) => {
console.log(err)
});
方案2:无别称
models.Score.belongsTo(models.Stu, {
foreignKey: 'userId',
targetKey: 'id'
});
models.Score.create({
stu: {
name: '添加用户',
age: 50,
sex: '女',
},
projectName: '历史',
projectScore: '150'
}, {
raw: true,
include: [{
model: models.Stu
}]
}).then((res) =>{
console.log(JSON.stringify(res, null, 2))
}).catch((err) => {
console.log(err)
});
在1:1的关系类型中,有无别称都可以进行正常的添加操作
2、将stu和score设置为stu:score= 1:n
2.1、无别称情况下
models.Stu.hasMany(models.Score, {
foreignKey: 'userId', // 对于一对多关系,外键在于多的那一方
targetKey: 'id'
})
models.Stu.create({
name: '添加用户',
age: 50,
sex: '女',
score: {
projectName: '历史',
projectScore: '150'
}
}, {
raw: true,
include: [{
model: models.Score
}]
}).then((res) =>{
console.log(JSON.stringify(res, null, 2))
}).catch((err) => {
console.log(err)
});
在没有对score设置别称的时候,正常默认应该是表名score,但是执行的时候发现控制台打印的sql语句如下:仅添加了stu的信息,而score并不会像1:1那样子也添加上去。
2.2 、有别称的情况下
models.Stu.hasMany(models.Score, {
foreignKey: 'userId', // 对于一对多关系,外键在于多的那一方
targetKey: 'id',
as: 'score'
})
models.Stu.create({
name: '添加用户',
age: 50,
sex: '女',
score: {
projectName: '历史',
projectScore: '150'
}
}, {
raw: true,
include: [{
model: models.Score,
as: 'score'
}]
}).then((res) =>{
console.log(JSON.stringify(res, null, 2))
}).catch((err) => {
console.log(err)
});
在有别称的情况下,执行上述的代码,可以看到控制台打印的消息为既添加了stu信息,有添加了score信息
3、待续
综上:
在1: 1关系类型中,有无别称对添加结果无影响,但是在1:n关系类型中,如果不添加别称,反而无法正常的将数据添加到数据库。原因暂时无从得知,如果有朋友知道,欢迎指出!