2016-02-03 58 views
0

我有这样相关的两个表:Sequelize的findAll与belongsToMany协会

联赛

sequelize.define('league', { 
    name: { 
    type: DataTypes.STRING, 
    }, 
    ownerId: { 
    type: DataTypes.INTEGER, 
    } 
}, { 
    classMethods: { 
    associate: function(models) { 
     League.belongsToMany(models.user, { 
     constraints: false, 
     through: models.UserLeague, 
     }); 
    } 
    } 
}, { 
    freezeTableName: true 
}); 

用户

sequelize.define('user', { 
    name: { 
    type: DataTypes.STRING 
    }, 
    email: { 
    type: DataTypes.STRING, 
    unique: true, 
    validate: { 
     isEmail: true 
    } 
    }, 
    profile_picture: { 
    type: DataTypes.STRING 
    } 
}, { 
    classMethods: { 
    associate: function(models) { 
     User.belongsToMany(models.league, { 
     constraints: false, 
     through: models.UserLeague, 
     }); 
    } 
    } 
}, { 
    freezeTableName: true 
}); 

我想获得的所有联赛是在他们中有一定的用户:我现在正在执行此操作,但出现错误column league.users.id does not exist

sequelize.transaction(function (t) { 
    return models.user.findOne({where: {email: req.query.email}}, {transaction: t}).then(function(user) { 
     return models.league.findAll({where: {'users.id': user.id}, include: [{model: models.user, as: 'users'}]}).then(function(leagues) { 
     res.json(leagues); 
     }); 
    }); 
}); 

我该如何检索哪里有某个用户的联赛?

回答

2

您应该添加您的where到包括模型:

sequelize.transaction(function (t) { 
    return models.user.findOne({where: {email: req.query.email}}, {transaction: t}).then(function (user) { 
     return models.league.findAll({ 
      include: [{ 
       model: models.user, 
       as: 'users', 
       where: { 
        id: user.id 
       }, 
       required: true 
      }] 
     }).then(function (leagues) { 
      res.json(leagues); 
     }); 
    }); 
}); 

更新:

它不是真的不错,但我thinik,有没有更好的解决办法:

sequelize.transaction(function (t) { 
    return models.user.findOne({where: {email: req.query.email}}, {transaction: t}).then(function (user) { 
     var _leagueIds = []; 
     return models.league.findAll({ 
      include: [{ 
       model: models.user, 
       as: 'users', 
       where: { 
        id: user.id 
       }, 
       required: true 
      }] 
     }) 
      .each(function (league) { 
       _leagueIds.push(league.id); 
      }) 
      .then(function() { 
       return models.league.findAll({ 
        where: { 
         id: _leagueIds, 
        }, 
        include: [{ 
         model: models.user, 
         as: 'users' 
        }] 
       }); 
      }) 
      .then(function (leagues) { 
       res.json(leagues); 
      }); 
    }); 
}); 
+0

好的,这部分是我想要的:)这给了我包含我想要的用户的联盟,但是只返回了想要的用户而不是联盟所有属于联盟的用户。你明白我的意思吗? –

+0

我很确定,你需要两个查询来实现这一点。 – Adam

+0

也许,但我不知道如何。第一个可以检索联盟,但是如何添加联盟中的所有用户。这就是我想念的。不知道我需要它为我在做什么,但我想知道如何去做:) –