Sequelize 6使用关联子查询过滤父模型 查询最新请求符合状态的用户
报错原因
你出现missing FROM-clause entry for table "requests"报错有两个核心诱因:
- 你在
include中配置了separate: true,这个配置会让Sequelize拆分查询:先单独查用户表,再用用户ID批量查请求表,顶层where里的$requests.status$在第一次查用户的SQL里找不到关联的requests表,自然报错。 - 一对多关联下直接在include中加
limit确实是Sequelize 6的已知问题,没必要硬踩这个坑。
适配方案
你的需求完全可以通过子查询匹配最新请求的方式实现,不需要用到limit,代码示例如下:
const { Op, literal } = require('sequelize'); // 前提:User和Request已正确关联 User.hasMany(Request, { as: 'requests' }) const result = await User.findAll({ offset: page, limit: rowsPerPage, subQuery: false, include: [{ as: 'requests', model: Request, required: true, // 内连接,只有匹配到符合条件请求的用户才会返回 where: { status: true, // 匹配当前用户最新的请求记录 [Op.and]: literal(`requests.created_at = (SELECT MAX(created_at) FROM requests WHERE user_id = User.id)`) } }] });
这个写法生成的SQL和你想要的原生SQL逻辑完全一致:先找到每个用户的最新请求,过滤出status为true的,再关联返回对应的用户和这条最新请求,同时避开了关联limit的bug。
内容的提问来源于stack exchange,提问作者Makis
相关产品推荐
相关产品推荐

