2016-05-26 4 views
1

Мы имеем схему базы данных, как показано ниже:Вложенные записи вставки с 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.js и Knex.js. Я хочу вставить student и вложить education history в базу данных, используя bluebird обещание с Knex. Как я могу решить эту проблему.

Я попытался с следующим обещанием:

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

ответ

2

К сожалению ответить на мой собственный вопрос, но я хочу объяснить только то, как я могу решить.

Мы можем сделать действие несколькими способами

  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 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); 
          }) 
         }); 
         }); 
        ); 
    
Смежные вопросы