2016-12-25 2 views
1

Ich habe zwei bekam belongsToMany Modelle:Sequelize: Finden Datensätze basierend auf assoziierten BelongsToMany Record-- aber immer noch alle zugehörigen Datensätze?

const apptsModel = db.define('Appts', { 
    id: {type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true}, 
    [.....] 
}); 

const UserDataModel = db.define('UserData', { 
    id: {type: Sequelize.STRING, primaryKey: true}, 
    gender: {type: Sequelize.STRING}, 
    name_title: {type: Sequelize.STRING}, 
    name_first: {type: Sequelize.STRING}, 
    name_last: {type: Sequelize.STRING}, 
    [.....] 
}); 

apptsModel.belongsToMany(UserDataModel, {through: 'ApptsToUsers'}); 
UserDataModel.belongsToMany(apptsModel, {through: 'ApptsToUsers'}); 

Ich möchte eine Suche tun, dass:

1) alle Termine findet, für die mindestens einer der zugehörigen Benutzer einen bestimmten Benutzer-ID hat.

2) Gibt alle zugeordneten Benutzer für diesen Termin zurück.

Ich habe Arbeits sequelize Code, der tut (1):

var ret = connectors.Appts.findAll({ 
    include: [connectors.UserData], 
    where: {'$UserData.id$': args.originatingUserID} 
}).then((res) => res.map((item) => item.dataValues)); 

... aber es gibt nur die zugehörigen Benutzerdaten für den einen bestimmten Benutzer. Wie gebe ich die Daten für alle verknüpften Benutzer für jeden Termin zurück?

Antwort

0

Es scheint nicht viel Dokumentation darüber zu geben, wie dies noch zu tun ist. Das funktioniert, also poste ich das hier zu Referenzzwecken.

getAllApptsForCurrentUser(_, args) { 
     return Promise.resolve() 
      .then(() => { 
       //find all appointments and find those for which at least one 
       //participating user is the one specified in originatingUserID 
       var appts = connectors.Appts.findAll({ 
        include: [{ 
         model: connectors.UserData, 
         where: {id: args.originatingUserID} 
        }], 
       }).then((res) => res.map((item) => item.dataValues)); 
       return appts; 
      }) 
      .then(appts => { 
       //iterate returned appointments and perform a subquery on each, 
       //finding the other participating users 
       var arrayOfPromises = []; 
       appts.forEach(function (appt) { 
        arrayOfPromises.push(
         connectors.Appts.findOne({where: {id: appt.id}, order: [['apptDateTime']], include: [ connectors.UserData ] }) 
        ); 
       }); 
       //Promise.all returns true when all promises passed to it have 
       //returned true, or when one of them returns false 
       return Promise.all(arrayOfPromises); 
      }) 
      .then(apptsWithJoinedData => { 
       //console.log(apptsWithJoinedData); 
       return apptsWithJoinedData; 
      }) 
      .catch((err)=> { 
       console.log(err); 
      }); 
    } 

Wenn es einen besseren Weg gibt, lass es mich wissen.

+0

Ich würde auch gerne wissen, ob es eine einfachere Möglichkeit gibt, dies in einer einzigen Abfrage anstelle von mehreren Abfragen zu tun. –

Verwandte Themen