2016-08-12 3 views
0

たとえば、モデルStudentとそれに関連するいくつかのモデルがあります。 ClassAbsenceおよび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を使ってこれを行う方法はありますか?

答えて

0

要求されたモデルとフィルタで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

を見ます
関連する問題