如何用Sequelize编写单条查询获取用户所有拥有或加入的挑战
查询指定用户所有拥有或加入挑战的Sequelize实现方案
实现逻辑
核心通过左连接关联participants表,配合OR条件覆盖两种符合要求的场景,同时加去重配置避免结果重复:
- 场景1:用户是挑战所有者,即
challenges.userId等于目标用户ID - 场景2:用户是挑战参与者,即关联的
participants.userId等于目标用户ID
完整查询代码
const { Op } = require('sequelize'); const targetUserId = 2002; // 替换为实际要查询的目标用户ID const userChallenges = await Challenge.findAll({ include: [{ model: Participant, attributes: [], // 不需要返回参与者表字段时可设为空数组减少返回数据 required: false // 左连接配置,保障无参与者的所有者挑战也能被查询到 }], where: { [Op.or]: [ { userId: targetUserId }, { '$participants.userId$': targetUserId } ] }, distinct: true // 去重,避免同一个挑战因多条参与者关联记录重复返回 });
代码说明
required: false配置将两表关联改为左外连接,不会因为挑战没有对应参与者记录就过滤掉用户作为所有者创建的挑战'$participants.userId$'是Sequelize专属的关联表字段引用语法,框架会自动解析为对应表的字段进行条件判断distinct: true用于去重,避免单个挑战关联多条参与者数据时,同一条挑战记录被多次返回的问题
用你提供的示例数据执行上述代码,返回结果和预期完全一致。
内容的提问来源于stack exchange,提问作者bremi
相关产品推荐
相关产品推荐

