Sequelize查询:筛选含办公地址的用户并返回其全部地址
解决Sequelize中筛选含指定类型地址的用户并返回全部地址的问题
你的问题出在将筛选条件写在了关联模型的include配置中,这会同时过滤关联数据和用户,但只保留符合条件的关联地址。要实现筛选出拥有type='office'地址的用户,同时返回这些用户的全部地址,需要把用户筛选逻辑和关联地址查询逻辑分开,以下是两种可行方案:
方案一:使用Op.exists子查询
通过EXISTS语句判断用户是否存在符合条件的地址,再关联查询所有地址:
const users = await User.findAll({ where: { [Sequelize.Op.exists]: Sequelize.literal(` SELECT 1 FROM "Addresses" WHERE "Addresses"."userId" = "User"."id" AND "Addresses"."type" = 'office' `) }, include: [ { model: Address, as: 'Addresses' // 需与关联定义的别名保持一致 } ] });
方案二:使用Op.in子查询
先查询出所有拥有office地址的用户ID,再通过ID筛选用户并关联全部地址:
const users = await User.findAll({ where: { id: { [Sequelize.Op.in]: Sequelize.literal(` SELECT "userId" FROM "Addresses" WHERE "Addresses"."type" = 'office' `) } }, include: [ { model: Address, as: 'Addresses' } ] });
关键说明
- 主查询的
where负责筛选用户:确保只返回存在office地址的用户; include仅负责关联用户的全部地址,不添加额外where条件,这样就能返回用户的所有地址数据;- 注意保持
include中的as和模型关联定义的as: 'Addresses'一致,避免关联失败。
内容的提问来源于stack exchange,提问作者Idan Youval
相关产品推荐
相关产品推荐

