簡體   English   中英

用 belongsToMany 關聯對 findAll 進行續集

[英]Sequelize findAll with belongsToMany association

我有兩個以這種方式相關的表:

聯盟

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

我怎樣才能檢索有某個用戶的聯賽?

您應該將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);
            });
    });
});

總結本文檔<\/a>,我們有以下內容:

如果您有以下型號:

const User = sequelize.define('user', { name: DataTypes.STRING });
const Task = sequelize.define('task', { name: DataTypes.STRING });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM