たとえば、モデルStudent
とそれに関連するいくつかのモデルがあります。 Class
、Absence
およびGrade
としましょう。このモデルのためのparamsがリレーションを記述するときにクエリパラメータを継承する方法
定義:
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' })
私はこのモデルのエンティティを一覧表示するエンドポイントを追加します。また、このエンドポイントでオプションのフィルタを使用できるようにしたいと考えています。 したがって、この用法の両方が可能になります:私が欲しいとき
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'
}))
をしかし:
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
に存在するのparamsを扱う一方で、それは簡単です実装absense
またはavg_grade
フィルターを追加するには、私はfrを下げる必要がありますomはこれを続行し、生のクエリを書くと膨大なものになります。
今私は特別なstudents_expanded
を作成することを考えていますが、確かに私は何かを見逃していません。 Sequelizeを使ってこれを行う方法はありますか?