如何 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: 在集合中的每个实例上调用模型方法