Sequelize self-referential many-to-many;如何指定我加入的内容
Sequelize self-referential many-to-many; how to specify what I'm joining on
我有一个 Sequelize 结构,它通过 Follow
table、follower
和 following
将我的 User
table 与其自身相关联.我 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
}
});
其中 returns 一个用户和一组关注条目。
我遇到的问题是,Sequelize 似乎默认将 Follow
查询创建为 where: { followING: User.id }
而不是 where: followER
,这样如果我有 1 个用户关注自己和其他 2 个用户,但只有他们自己关注,它只有 returns 1 个来自我的关注 table。当我循环遍历种子中少数用户的主键时,结果中只有 following
值发生变化,因此我只返回用户的关注者,而不返回该用户的其他用户正在关注。
当多个列与我要加入的 Sequelize 对象匹配时,有没有办法在 include
中指定我要加入的特定列?
我了解最坏的情况,我总是可以跳过 User
步骤并直接转到
Follow.findAll({
where: {
follower: id
}
})
但这限制了我对 User 对象的直接访问,我不得不编写一个额外的查询,考虑到存在自关联的多对多功能,这似乎很麻烦。
如果您希望获得拥有关注者或关注者的用户,则无需指明 Follow
table。您只需要指明所需关联的别名:
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'
}
});
我有一个 Sequelize 结构,它通过 Follow
table、follower
和 following
将我的 User
table 与其自身相关联.我 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
}
});
其中 returns 一个用户和一组关注条目。
我遇到的问题是,Sequelize 似乎默认将 Follow
查询创建为 where: { followING: User.id }
而不是 where: followER
,这样如果我有 1 个用户关注自己和其他 2 个用户,但只有他们自己关注,它只有 returns 1 个来自我的关注 table。当我循环遍历种子中少数用户的主键时,结果中只有 following
值发生变化,因此我只返回用户的关注者,而不返回该用户的其他用户正在关注。
当多个列与我要加入的 Sequelize 对象匹配时,有没有办法在 include
中指定我要加入的特定列?
我了解最坏的情况,我总是可以跳过 User
步骤并直接转到
Follow.findAll({
where: {
follower: id
}
})
但这限制了我对 User 对象的直接访问,我不得不编写一个额外的查询,考虑到存在自关联的多对多功能,这似乎很麻烦。
如果您希望获得拥有关注者或关注者的用户,则无需指明 Follow
table。您只需要指明所需关联的别名:
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'
}
});