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

标签 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 View ,但我想确定,我没有遗漏任何东西。有没有办法使用 Sequelize 做到这一点?

    最佳答案

    添加具有请求模型和过滤器的 include 对象,并在其上设置 required: true

    以下将显示所有缺勤的学生:

    Student.findAll({
        where : condition,
        limit : req.query.limit || 20,
        offset : req.query.offset || 0,
        order : req.query.order || 'id ASC'
        include: {
            model: Absense,
            required: true
        }
    }))
    

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

    关于api - 当params描述关系时如何将查询参数传递给sequelize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38922436/

    相关文章:

    javascript - 我应该如何在单个项目的多个文件中要求或使用相同的模块?

    json - Sequelize - 不要用 JSON 响应返回密码

    sql-server - 按字段组合序列化过滤器

    javascript - 何时在 AngularJS 中使用 PATCH 和 PUT

    javascript - 使用 JavaScript 和 Angular (HttpClient) 进行 FPL Api 身份验证

    android - 如何为我的 Android 应用程序获取 Google Places API key

    express - sequelize创建db记录后如何从响应中删除json元素?

    typescript - TS2339 : Property 'user' does not exist on type 'Request'

    javascript - Yammer REST API CORS

    javascript - 表之间的序列化和查询