2016-07-29 58 views
0

我正在使用postgresql,knex和書架進行查詢以更新我的用戶表。我想查找所有在特定時間內未登錄的用戶,然後更新他們的numAbsences和numTardies字段。如何返回並更新書架中的表knex

但是,使用bookshelf.knex運行原始sql查詢時,我得到的結果是用戶的對象數組而不是對象的書架對象數組,因爲我無法直接將對象保存到數據庫,當我嘗試使用.save()。我得到例外user.save is not a function

有誰知道我可以如何更新數據庫中的值爲用戶?我已經看到了更新功能,但我還需要在absentUsers中返回用戶,因此我現在選擇它們。

// field indicates whether the student was late or absent 
var absentUsers = function(field){ 
    // returns all users who did not sign in during a specific time 
    if (ongoingClasses){ 
    return bookshelf.knex('users') 
     .join('signed_in', 'signed_in.studentId', '=', 'users.id') 
     .where('signed_in.signedIn', false) 
     .select() 
     .then(function(users){ 
     markAbsent(users, field); 
     return users; 
     }); 
    } 
} 

var markAbsent = function(users, field){ 
    users.forEach(function(user){ 
    user[field]++; 
    user.save(); 
    }) 
} 

回答

0

我已經通過在knex中使用另一個sql查詢解決了我的問題。看起來沒有辦法使用sql查詢,然後使用標準bookhelf knex方法,因爲返回的對象不是書架封裝對象。

var absentUsers = function(field){ 
    // returns all users who did not sign in during a specific time 
    if (ongoingClasses){ 
    return bookshelf.knex('users') 
     .join('signed_in', 'signed_in.studentId', '=', 'users.id') 
     .where('signed_in.signedIn', false) 
     .select() 
     .then(function(users){ 
     markAbsent(users, field); 
     }); 
    } 
} 

var markAbsent = function(users, field){ 
    users.forEach(function(user){ 
    var updatedUser = {}; 
    updatedUser[field] = user[field]+1; 
    bookshelf.knex('users') 
     .where('users.id', user.id) 
     .update(updatedUser).then(function(){ 
     }); 
    }); 
} 
0

與您的代碼bookshelf.knex('users')你離開了「書架世界」,並在「原始knex世界」。 Knex本身並不知道你的書架封套對象。

您可以使用Bookshelf query方法獲得兩全其美。

假設你的模型類是User,你的榜樣看起來幾乎相當於

User.query(function(qb) { 
     qb.join('signed_in', 'signed_in.studentId', 'users.id') 
      .where('signed_in.signedIn', false); 
    }) 
    .fetchAll() 
    .then(function(bookshelfUserObjects) { 
     /*mark absent*/ 
     return bookshelfUserObjects.invokeThen('save'); // <1> 
    }); 

< 1>invokeThen:在收集

上的每個實例調用模型方法
相關問題