2016-09-29 77 views
3

我想向表中添加一列,然後執行一些工作以將該列填充爲遷移的一部分。填充列需要在代碼中進行一些操作。考慮兩個表:用戶[user_id,first_name,last_name]和Orders [order_id,user_id,other_field_1,other_field_2]。在knex遷移中運行更新

而且功能

var getNickName = function(user_row) { 

    //do a bunch of javascripty stuff here 
    //based on user_row.first_name and user_row.last_name. 
    //i.e., stuff not possible in SQL 

    return 'nickname'; 
} 

我想knex遷移,增加了一個 'user_nick_name' 字段Orders表。然後用getNickName()的輸出更新新列。

我需要這個在交易中。

我知道我需要添加列到訂單,然後選擇所有訂單,遍歷所執行的訂單:將用戶行傳遞到getNickName,然後使用它在用戶表上調用更新設置值。

當涉及到一個事務時,我似乎無法得到所有這些knex語法。

回答

4
export function up(knex, Promise) { 
    return knex.select() 
    .from('Users') 
    .then((users) => { 
    const nickNames = users.map((user) => { 
     return { userId: user.user_id, nickName: getNickName(row) }; 
    }); 
    return knex.transaction((trx) => { 
     return knex.schema.table('Orders', (table) => table.string('user_nick_name').transacting(trx)) 
     .then(() => { 
     return Promise.all(
      nickNames.map((row) => { 
      return knex('Orders') 
      .update({ user_nick_name: row.nickName }) 
      .where('user_id', row.userId) 
      .transacting(trx); 
      }); 
     ); 
     }) 
     .then(trx.commit) 
     .catch(trx.rollback); 
    }); 
    }); 
} 

export function down(knex) { 
    return knex.schema.table('Orders', (table) => table.dropColumn('user_nick_name')); 
}