使用knex.js插入嵌套记录

时间:2016-05-26 12:37:39

标签: javascript node.js database bluebird knex.js

我们有一个数据库架构如下:

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.jsKnex.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);
      });
    })
  }

1 个答案:

答案 0 :(得分:3)

  

很抱歉回答我自己的问题但我想解释一下我该如何解决。

我们可以通过多种方式采取行动

  1. 参考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());
    
  2. 另一种方法是使用Bluebird Promise.join APIBluebird 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);
              })
            });
          });
        );