当params描述关系时,如何将查询参数传递给sequelize

时间:2016-08-12 16:15:56

标签: api express sequelize.js

例如,我有模型Student和几个与之相关的模型。设为ClassAbsenceGrade

此模型的定义:

var Student = sequelize.define('Student', {
    class_id : DataTypes.INTEGER,
    name : DataTypes.INTEGER,
    gender : DataTypes.ENUM('male', 'female')
    is_paid : DataTypes.BOOLEAN
})

var Class = sequelize.define('Class', {
    name : DataTypes.STRING
})

var Absense = sequelize.define('Absense', {
    student_id : DataTypes.INTEGER
    date : DataTypes.DATEONLY,
})

var Grade = sequelize.define('Grade', {
    student_id : 
    subject : DataTypes.ENUM('singing', 'dancing')
    value : DataTypes.INTEGER
})

Absense.belongsTo(Student, { foreign_key : 'student_id' });
Grade.belongsTo(Student, { foreign_key : 'student_id' })

我想将端点添加到此模型的列表实体中。但我也想允许在此端点中使用可选过滤器。 所以这两种用法都是可能的:

  • GET api.acme.com/v0.1/users
  • GET api.acme.com/v0.1/users? class=1,3 &gender=male &is_paid=true &absences=true &avg_grade=gt:3 &limit=20&offset=0&order=avg_grade%20DESC

当我处理Student中存在的参数时,这很简单:

var condition = {};

req.params.is_paid && condition.is_paid = boolean(req.params.is_paid);
req.params.gender && condition.gender = { $in : req.params.gender.split(',') };
req.params.class && condition.class = { $in : req.params.class.split(',') };

res.json(await Student.findAll({
    where : condition,
    limit : req.query.limit || 20,
    offset : req.query.offset || 0,
    order : req.query.order || 'id ASC'
}))

但是当我想添加工具absenseavg_grade过滤器时,我必须从sequelize中退出并为此编写原始查询,这将变得非常大。

现在我正考虑为此创建特殊的students_expanded视图,但我想确定,我没有遗漏任何内容。有没有办法用Sequelize做到这一点?

1 个答案:

答案 0 :(得分:0)

使用请求的模型添加show dbs对象并过滤并在其上设置include

以下内容将显示所有缺席的学生:

required: true

平均成绩较为棘手,因为您需要汇总成绩以获得平均成绩 - 请参阅Average of grouped data in column using Sequelize