javascript - 将 findAll 与 ownToMany 关联序列化

标签 javascript node.js sequelize.js

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

联赛

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

关于javascript - 将 findAll 与 ownToMany 关联序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35184399/

相关文章:

javascript - 如何分配给函数的成员?

javascript - 如何更改新添加的脚本标签内容的缩进

javascript - 将回调传递给深度嵌套函数的最佳实践

javascript - 在 Node 模块 module.exports 中使用胖箭头

node.js - 如何使用动态助手覆盖express.js中的Flash消息?

javascript - jQuery UI 可拖动不会回到第一点

javascript - Python:解析类似 JSON 的 Javascript 数据结构(带连续逗号)

Sequelize.js - 如何访问相关的内存项

node.js - 将 Sequelize 模型转换为 JSON Schema 以进行用户输入验证

mysql - 如何使用sequelize mysql在Nodejs中保存数据时排除Id