我正在使用postgresql,knex和bookshelf来查询以更新我的users表。我想找到所有在特定时间内没有登录的用户,然后更新他们的numAbsences和numTardies字段。
然而,当使用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 :(得分:0)
我通过在knex中使用另一个SQL查询解决了我的问题。似乎没有办法使用sql查询然后使用标准的书架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(){
});
});
}
答案 1 :(得分:0)
使用您的代码bookshelf.knex('users')
,您可以离开“书架世界”并进入“原始世界”。仅Knex不了解您的Bookshelf包装器对象。
您可以使用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>
});
&LT 1为卤素; invokeThen:对集合中的每个实例调用模型方法