You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:23:09