Node.js+Sequelize构建REST API:如何关联查询好友名称
在Sequelize中关联Users与Friends表获取好友姓名
这是个很典型的关联查询场景,咱们可以通过Sequelize的模型关联和include查询来解决这个问题,具体步骤如下:
第一步:给Friend模型添加双向关联
因为Friends表的UserID和idFriend都指向Users表的主键,所以需要给Friend模型定义两个belongsTo关联,并用别名区分不同的关联方向:
// 在Friend模型文件中添加关联配置 Friend.belongsTo(models.User, { as: 'Initiator', // 发起好友关系的用户 foreignKey: 'UserID' }); Friend.belongsTo(models.User, { as: 'TargetFriend', // 被关联的好友用户 foreignKey: 'idFriend' });
第二步:修改查询逻辑,关联User表获取姓名
接下来调整你的findAll查询,通过include选项把关联的User数据一起查出来,同时注意Sequelize版本的语法差异:
// 若使用Sequelize v5及以上版本,需要先导入Op const { Op } = require('sequelize'); const rawFriendRecords = await models.Friend.findAll({ where: { [Op.or]: [ { UserID: userFound.id }, { idFriend: userFound.id } ], status: "active" }, include: [ { model: models.User, as: 'Initiator', attributes: ['id', 'name'] // 只查询需要的字段,减少冗余数据 }, { model: models.User, as: 'TargetFriend', attributes: ['id', 'name'] } ] });
第三步:格式化结果,提取正确的好友姓名
因为每条Friend记录里,当前用户可能是发起方(UserID)也可能是接收方(idFriend),所以需要通过判断筛选出对应的好友信息:
const friendListWithNames = rawFriendRecords.map(record => { const isCurrentUserInitiator = record.UserID === userFound.id; return { friendId: isCurrentUserInitiator ? record.idFriend : record.UserID, friendName: isCurrentUserInitiator ? record.TargetFriend.name : record.Initiator.name }; }); // 此时friendListWithNames就是包含好友姓名的最终列表 console.log(friendListWithNames);
注意:如果你的Sequelize版本是v4及更早,可以把
[Op.or]替换为$or,无需导入Op模块。
内容的提问来源于stack exchange,提问作者tetar
相关产品推荐
相关产品推荐

