Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将findAll与belongtomany关联进行续集_Javascript_Node.js_Sequelize.js - Fatal编程技术网

Javascript 将findAll与belongtomany关联进行续集

Javascript 将findAll与belongtomany关联进行续集,javascript,node.js,sequelize.js,Javascript,Node.js,Sequelize.js,我有两个以这种方式相关的表: 联盟 sequelize.define('league', { name: { type: DataTypes.STRING, }, ownerId: { type: DataTypes.INTEGER, } }, { classMethods: { associate: function(models) { League.belongsToMany(models.user, { const

我有两个以这种方式相关的表:

联盟

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
});
我想获取所有包含某个用户的联盟:我现在正在这样做,但是我得到了错误
列league.users.id不存在

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

我如何检索存在某个用户的联盟?

您应该将您的
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);
        });
    });
});
更新:

这不是很好,但我认为,没有更好的解决方案:

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

您应该将
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);
        });
    });
});
更新:

这不是很好,但我认为,没有更好的解决方案:

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

好的,这部分是我想要的:)这给了我一个包含我想要的用户的联盟,但是只返回想要的用户的联盟,而不是属于该联盟的所有用户的联盟。你明白我的意思吗?我很确定,你需要两个查询来实现这一点。可能吧,但我不知道如何实现。第一个可以检索联盟,但是如何添加联盟中的所有用户。这就是我所缺少的。我不确定我在做什么需要它,但我想知道怎么做:)我用这个修改了答案。它看起来确实很好。我会尽快尝试,并让你知道,但谢谢!好的,这部分是我想要的:)这给了我一个包含我想要的用户的联盟,但是只返回想要的用户的联盟,而不是属于该联盟的所有用户的联盟。你明白我的意思吗?我很确定,你需要两个查询来实现这一点。可能吧,但我不知道如何实现。第一个可以检索联盟,但是如何添加联盟中的所有用户。这就是我所缺少的。我不确定我在做什么需要它,但我想知道怎么做:)我用这个修改了答案。它看起来确实很好。我会尽快尝试,并让你知道,但谢谢!