如何在Bookshelf js中使用groupBy?

时间:2018-01-04 08:11:32

标签: node.js angular knex.js bookshelf.js

如何在 Bookshelf JS 中使用groupBy,这是我的控制器代码。

router.route('/fetchStudentAttendance')
.post(function(req, res) {
 StudentAttendance
  .query(function (qb){
    qb.where('date', '>=', req.body.date);
    qb.groupBy("students_id");
  })
.where({'class_id': req.body.class_id, 'section_id': req.body.section_id})
.fetchAll({ withRelated: [{'StudentRef':function(qb) {qb.column('id', 'first_name', 'middle_name', 'last_name')}}]})
.then(studentAttendance => {
  let content = {
    data: studentAttendance,
    success: true,
    message: 'Record Not Found',
  };
  return res.send(content);
})
.catch(error => {
  let content = {
      data: error,
      success: false,
      message: 'Error while fetching Student Attendance.',
    };
  return res.send(content);
});

});

当我尝试“groupBy”employee_id时,它会像这样给出错误。

code:"42703"
file:"parse_relation.c"
length:110
line:"3194"
name:"error"
position:"127"
routine:"check_ungrouped_columns_walker"
severity:"ERROR"

1 个答案:

答案 0 :(得分:4)

TL; DR

使用Bookshelf的built-in Collection manipulationgroupBy后执行自定义.fetchAll() 要么 使用原始Knex根据需要生成查询和结果,因为groupBy将需要一些SQL聚合定义。这可以是Knex查询结果,也可以是Bookshelf对象。

更多单词

Bookshelf并不是一个查询生成器;它不是像查询libray KnexJS那样构建的。 Bookshelf是一种从数据库中收集行作为对象模型的方法。一个SQL" groupBy"子句是查询的一种自定义,而Bookshelf本身实现了lodash方法,例如lodash' groupBystated in their docs。但是,这是对查询数据的服务器端分组,它不使用SQL来执行此操作。

在Bookshelf中使用Model时,您应该在获取之前使用new ModelModel.forge()(或在许多情况下使用.fetchAll())。您可以使用Model.querysee docs)以某种方式启动Knex查询,但请注意返回Bookshelf对象。我通常使用.query(function (qb) {})来执行一些自定义knex,例如自定义WHERE子句或qb.orderBy('prop')。由于groupBy会包含多个',您需要Model.query().fetchAll(),并且要知道该查询中的自定义聚合(Bookshelf可能会处理它,但它不会与您定义的模型完全一样,尤其是使用自定义方法)。直接使用Knex也是一个不错的选择。