如何在bookshelf knex中返回和更新表

时间:2016-07-29 04:05:59

标签: postgresql bookshelf.js knex.js

我正在使用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();
  })
}

2 个答案:

答案 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:对集合中的每个实例调用模型方法