例如,我有模型 Student
和几个与之相关的模型。让它成为 Class
、 Absence
和 Grade
。
此模型的定义:
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'
}))
但是当我想添加工具
absense
或 avg_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/