Sequelize中表同时关联同表belongsTo和belongsToMany时findAll用法
问题原因
你当前的查询只关联了一次User模型,由于Item和User存在两类不同的关联,Sequelize默认只会匹配第一个定义的belongsTo创建者关联,因此不会返回点赞用户列表。
解决步骤
1. 给关联配置添加别名区分
首先需要修改关联定义,通过as参数给两类不同的User关联设置唯一别名,让Sequelize可以区分不同的关联关系:
// User表关联修改 db.User.hasMany(db.Item, { foreignKey: 'userIdx', sourceKey: 'userIdx', as: 'createdItems' }); db.User.belongsToMany(db.Item, { through: 'Like', foreignKey: 'userIdx', as: 'likedItems' }); // Item表关联修改 db.Item.belongsTo(db.User, { foreignKey: 'userIdx', targetKey: 'userIdx', as: 'creator' // 创建者关联别名 }); db.Item.belongsToMany(db.User, { through: 'Like', foreignKey: 'itemIdx', as: 'likeStateUsers' // 点赞用户关联别名,和你需要的返回字段名保持一致 });
Like表的原有关联配置无需修改。
2. 调整查询语句同时关联两类数据
查询时在include数组中分别引入两个不同别名的关联即可:
const result = await Item.findAll({ include: [ // 关联获取Item创建者信息 { model: User, as: 'creator', // 可选:指定只返回需要的创建者字段,避免冗余 attributes: ['userIdx', 'nickname', 'avatar'] }, // 关联获取点赞该Item的用户列表 { model: User, as: 'likeStateUsers', // 可选:过滤掉中间表Like的冗余返回字段 through: { attributes: [] }, // 可选:指定只返回需要的点赞用户字段 attributes: ['userIdx', 'nickname'] } ], })
执行后返回的每个Item对象就会自带creator创建者信息和likeStateUsers点赞用户数组,和你需要的结构完全匹配。
内容的提问来源于stack exchange,提问作者DongDong
相关产品推荐
相关产品推荐

