Sequelize-Typescript同表多对多关联查询following结果异常
Sequelize 社交网络关注功能多对多关联查询异常修复
我在实现社交网络的用户关注功能时,用Sequelize定义了Follow中间模型:
export default class Follow extends Model { @PrimaryKey @ForeignKey(() => User) @Column(DataType.UUID) followerId: string; @PrimaryKey @ForeignKey(() => User) @Column(DataType.UUID) followeeId: string; }
接着在User模型里配置了多对多关联,用来关联用户的"关注列表"和"粉丝列表":
@BelongsToMany(() => User, () => Follow, 'followerId') following: User[] @BelongsToMany(() => User, () => Follow, 'followeeId') followers: User[]
但执行查询时出现问题:
const me = await User.findByPk('1230ae30-dc4f-4752-bd84-092956f5c633', { include: [ { model: User, as: 'followers' },{ model: User, as: 'following' } ] })
查询结果里followers数据正常,但following数组只返回当前用户自己,可数据库里明明记录了该用户关注了3位其他用户。查看Sequelize生成的SQL后发现,关联的JOIN条件错误。
最终通过给@BelongsToMany添加otherKey参数解决了问题,正确的关联配置如下:
@BelongsToMany(() => User, () => Follow, 'followeeId', 'followerId') followers: User[] @BelongsToMany(() => User, () => Follow, 'followerId', 'followeeId') following: User[]
原因说明
Sequelize的@BelongsToMany装饰器中,第三个参数是当前模型在中间表的外键,第四个参数是关联目标模型在中间表的外键。之前只指定了第三个参数,Sequelize自动推断的otherKey不符合业务逻辑,导致JOIN条件错误,查询结果异常。明确指定两个外键参数后,关联逻辑才正确匹配。
内容的提问来源于stack exchange,提问作者shaharsol
相关产品推荐
相关产品推荐

