如何 return 和更新 table in bookshelf knex
How to return and update a table in bookshelf knex
我正在使用 postgresql、knex 和 bookshelf 进行查询以更新我的用户 table。我想找到在特定时间未登录的所有用户,然后更新他们的 numAbsences 和 numTardies 字段。
然而,当 运行 使用 bookshelf.knex 的原始 sql 查询时,我为用户获得的结果似乎是一个对象数组,而不是对象的书架对象数组因为当我尝试使用 .save() 时无法将对象直接保存到数据库中。我得到异常 user.save is not a function
。
有谁知道如何为用户更新数据库中的值?我已经看到了更新功能,但我还需要 return absentUsers 中的用户,所以我目前 select 他们。
// 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();
})
}
我在 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(){
});
});
}
使用您的代码 bookshelf.knex('users')
,您将离开 "Bookshelf world" 并进入 "raw knex world"。仅 Knex 并不知道您的 Bookshelf 包装器对象。
您可以使用 Bookshelf query 方法来两全其美。
假设您的模型 class 是 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: 在集合中的每个实例上调用模型方法
我正在使用 postgresql、knex 和 bookshelf 进行查询以更新我的用户 table。我想找到在特定时间未登录的所有用户,然后更新他们的 numAbsences 和 numTardies 字段。
然而,当 运行 使用 bookshelf.knex 的原始 sql 查询时,我为用户获得的结果似乎是一个对象数组,而不是对象的书架对象数组因为当我尝试使用 .save() 时无法将对象直接保存到数据库中。我得到异常 user.save is not a function
。
有谁知道如何为用户更新数据库中的值?我已经看到了更新功能,但我还需要 return absentUsers 中的用户,所以我目前 select 他们。
// 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();
})
}
我在 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(){
});
});
}
使用您的代码 bookshelf.knex('users')
,您将离开 "Bookshelf world" 并进入 "raw knex world"。仅 Knex 并不知道您的 Bookshelf 包装器对象。
您可以使用 Bookshelf query 方法来两全其美。
假设您的模型 class 是 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: 在集合中的每个实例上调用模型方法