如何在 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"
答案 0 :(得分:4)
TL; DR
使用Bookshelf的built-in Collection manipulation在groupBy
后执行自定义.fetchAll()
要么
使用原始Knex根据需要生成查询和结果,因为groupBy将需要一些SQL聚合定义。这可以是Knex查询结果,也可以是Bookshelf对象。
更多单词
Bookshelf并不是一个查询生成器;它不是像查询libray KnexJS那样构建的。 Bookshelf是一种从数据库中收集行作为对象模型的方法。一个SQL" groupBy"子句是查询的一种自定义,而Bookshelf本身实现了lodash方法,例如lodash' groupBy
为stated in their docs。但是,这是对查询数据的服务器端分组,它不使用SQL来执行此操作。
在Bookshelf中使用Model
时,您应该在获取之前使用new Model
或Model.forge()
(或在许多情况下使用.fetchAll()
)。您可以使用Model.query
(see docs)以某种方式启动Knex查询,但请注意返回Bookshelf对象。我通常使用.query(function (qb) {})
来执行一些自定义knex,例如自定义WHERE
子句或qb.orderBy('prop')
。由于groupBy
会包含多个',您需要Model.query().fetchAll()
,并且要知道该查询中的自定义聚合(Bookshelf可能会处理它,但它不会与您定义的模型完全一样,尤其是使用自定义方法)。直接使用Knex也是一个不错的选择。