2016-12-25 5 views
1

У меня есть две модели: belongsToManySequelize: найдите записи на основе связанных друг с другом записей, записанных многими пользователями, но все же верните все связанные записи?

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'}); 

Я хочу, чтобы сделать поиск, что:

1) находит все назначения, для которых по крайней мере один из ассоциированных пользователей имеет конкретный идентификатор пользователя.

2) Возвращает всех связанных пользователей для этой встречи.

Я начала работать sequelize код, который делает (1):

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

... но он возвращает только связанные пользовательские данные для одного конкретного пользователя. Как вернуть данные для всех связанных пользователей для каждой встречи?

ответ

0

Кажется, что нет много документации о том, как это сделать. Это работает, поэтому я отправлю это здесь для справочных целей.

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); 
      }); 
    } 

Если есть лучший способ сделать это, пожалуйста, дайте мне знать.

+0

Я также хотел бы знать, есть ли более простой способ сделать это в одном запросе вместо нескольких запросов. –

 Смежные вопросы

  • Нет связанных вопросов^_^