2017-03-22 2 views
0

J'ai une association m: n entre deux tables avec sequelize comme ceci:Sequelize Trouver Association belongsToMany

Cours

module.exports = function(sequelize, DataTypes) { 

    var Course = sequelize.define('Course', { 
    ..... 
    }, 
    { 
     associate: function(models){ 
     Course.hasMany(models.Schedule); 
     Course.belongsTo(models.Period); 
     Course.belongsTo(models.Room); 
     Course.belongsTo(models.Subject); 
     Course.belongsTo(models.School); 
     Course.belongsTo(models.Person, { as: 'Teacher' }); 
     } 
    } 
); 
return Course; 
}; 

Personne

module.exports = function(sequelize, DataTypes) { 

    var Person = sequelize.define('Person', { 
    .... 
    }, 
    { 
     associate: function(models){ 
     Person.belongsTo(models.Role, { as: 'Role' }); 
     Person.belongsTo(models.School, { as: 'School' }); 
     Person.belongsTo(models.Person, { as: 'Tutor' }); 
     } 
    } 
); 

    return Person; 
}; 

Et la table d'association Inscription

module.exports = function(sequelize, DataTypes) { 

    var Enrollment = sequelize.define('Enrollment', { 
     .... 
    }, 
    { 
     associate: function(models){ 
     Enrollment.belongsTo(models.Product, {as: 'Product'}); 
     Enrollment.belongsTo(models.School, { as: 'School' }); 

     models.Person.belongsToMany(models.Course, {through: {model: Enrollment},foreignKey: 'StudentEnrollId'}); 
     models.Course.belongsToMany(models.Person, {through: {model: Enrollment},foreignKey: 'CourseEnrollId'}); 

     } 
    } 

); 
    return Enrollment; 
}; 

J'ai essayé la suite de cette « example » mais n'explique pas grand-chose plutôt que d'une simple requête où inclure le paramètre par.

Ce que j'essaie d'archiver est d'obtenir tous les cours donnés un numéro d'étudiant (modèle personne). Comme vous pouvez le voir, le modèle de cours enregistre uniquement l'identifiant des différentes tables qui forment ensemble un cours. La personne modèle est également associé aux différents modèles, donc je donne un nom identifiant personnalisé avec foreignKey: 'StudentEnrollId' mais lorsque je tente de spécifier le nom id dans l'inclure model : db.Person, as: 'StundetEnroll' la requête montre l'erreur suivante: Person (StudentEnroll) is not associated to Course

Répondre

1

Vous devez définir l'alias as aussi dans l'association belongsToMany

models.Person.belongsToMany(models.Course, { as: 'CourseEnrolls', through: { model: Enrollment }, foreignKey: 'StudentEnrollId'}); 
models.Course.belongsToMany(models.Person, { as: 'StudentEnrolls', through: { model: Enrollment }, foreignKey: 'CourseEnrollId'}); 

maintenant, vous serez en mesure d'interroger Course avec toutes ses étudiants et vice-versa

models.Course.findByPrimary(1, { 
    include: [ 
     { 
      model: models.Person, 
      as: 'StudentEnrolls' 
     } 
    ] 
}).then(course => { 
    // course.StudentEnrolls => array of Person instances (students of given course) 
}); 

Vous pouvez également utiliser get/set Associations méthodes pour récupérer ou définir des objets associés

// assuming that course is an instance of Course model 
course.getStudentEnrolls().then(students => { 
    // here you get all students of given course 
}); 
+0

Merci, ça m'a beaucoup aidé. Maintenant, je n'ai plus qu'à jouer avec les inclusions pour obtenir les autres données. – Ellebkey