首页 > 解决方案 > Sequelize 自引用多对多;如何指定我加入的内容

问题描述

我有一个 Sequelize 结构,User它通过一个Follow表将我的表与自身相关联,使用followerand following。我有 99% 的把握,我拥有所有必要的部件,可以按照我期望的方式工作;我有别名

User.belongsToMany(models.User, { through: models.Follow, as: 'Followers', foreignKey: 'follower'});
User.belongsToMany(models.User, { through: models.Follow, as: 'Following', foreignKey: 'following'});

User.hasMany(models.Follow, { foreignKey: 'following' });
User.hasMany(models.Follow, { foreignKey: 'follower' });

Follow.belongsTo(models.User, { foreignKey: 'following', as: 'Following' });
Follow.belongsTo(models.User, { foreignKey: 'follower', as: 'Follower' });

我可以打电话

User.findByPk(id, {
  include: {
    model: Follow
  }
});

它返回一个用户和一个 Follow 条目数组。
我遇到的问题是,Sequelize 似乎默认将Follow查询创建为where: { followING: User.id }而不是where: followER,这样如果我有 1 个用户关注自己和其他 2 个人,但只有他们自己关注,它只会从我的关注表返回 1 个结果. 当我循环遍历种子中少数用户的主键时,只有following结果中的值会发生变化,因此我只会返回用户的关注者,而不是用户关注的其他用户。
当多个列与我要加入的 Sequelize 对象匹配时,有没有办法在include我尝试加入的特定列中指定?
我知道最坏的情况我总是可以跳过User迈步直奔

Follow.findAll({
  where: {
    follower: id
  }
})

但这限制了我对 User 对象的直接访问,并且我必须编写一个额外的查询,考虑到存在自关联的多对多功能,这似乎很麻烦。

标签: javascriptsequelize.js

解决方案


如果您希望获得具有关注者或关注用户的用户,则无需指明Follow表格。您只需要指明所需关联的别名:

User.findByPk(id, {
  include: {
    model: User,
    as: 'Followers'
  }
});
User.findByPk(id, {
  include: {
    model: User,
    as: 'Following'
  }
});

如果您需要Follow直接包含,则需要添加如下关联:

User.hasMany(models.Follow, { as: 'FollowerLinks', foreignKey: 'follower'});
User.hasMany(models.Follow, { as: 'FollowingLinks', foreignKey: 'following'});

您还应该指定一个别名,以便 Sequelize 知道要使用什么关联:

User.findByPk(id, {
  include: {
    model: Follow,
    as: 'FollowerLinks'
  }
});

推荐阅读