我们有一个数据库架构如下:
students
表
| id |名字|地址|
学生有多个教育历史。
education_histories
表
| id |学位|大学| student_id | #student_id
是外键指向学生表
我们从客户端获取JSON结构,如下所示:
{
"name" :"Ram Neupane",
"address": "Kathmandu, Bagmati",
"education_histories": [
{
"degree": "I.Sc.",
"university": "Tribhuvan University"
}, {
"degree": "BE",
"university": "Tribhuvan University"
}
]
}
我是Node.js和Knex.js的新手。我想使用Knex使用bluebird promise在数据库中插入student
和嵌套education history
。我该如何解决这个问题。
我尝试过以下承诺:
function create (jsonParam) {
return new Promise(function (resolve, reject) {
knex('students')
.insert({name: jsonParam.name, address: jsonParam.address})
.returning('id')
.then(function (response) {
# Here, I want to insert record to education_histories table
})
.catch(function (err) {
reject(err);
});
})
}
答案 0 :(得分:3)
很抱歉回答我自己的问题但我想解释一下我该如何解决。
我们可以通过多种方式采取行动
参考Knex insert docs,我们可以通过将json对象放在数组中直接将多个记录插入到表中。所以,我们有jsonParam['education_histories']
这是一个包含education_history
json对象的数组。
var student_id = response[0];
var educationHistoryParams = jsonParam['education_histories'];
educationHistoryParams.forEach(function(educationHistory){
educationHistory.student_id = student_id;
});
knex('education_histories').insert(educationHistoryParams)
.then(resolve());
另一种方法是使用Bluebird Promise.join API或Bluebird Promise.map API。
var student_id = response[0];
var educationHistoryParams = jsonParam['education_histories'];
return Promise.join(
educationHistoryParams.forEach(function (educationHistory) {
educationHistory.student_id = student_id;
new Promise(function (resolve, reject) {
knex('education_histories').insert(educationHistory)
.then(resolve())
.catch(function (err) {
reject(err);
})
});
});
);