如何用Sequelize查询未关联Solutions记录的Orders数据?
解决方法
你的需求是获取没有对应Solutions记录的Orders,核心是用左外连接查询,然后筛选出关联Solutions不存在的订单。你原来的查询逻辑存在两个问题:
Op.notIn中直接使用Solutions.findAll会因为异步操作返回Promise,无法生成正确的SQL语句- 逻辑方向错误:你需要的是「没有关联Solutions的Orders」,而非「Solutions不在某个列表里的Orders」
正确查询代码
首先确保引入Sequelize的操作符:
const { Op } = require('sequelize');
然后使用以下查询:
Orders.findAndCountAll({ include: [ { model: Users, attributes: ['username', 'email', 'uid'], }, { model: Solutions, as: "solution", required: false, // 左外连接,即使没有对应Solutions也会返回Orders attributes: [] // 不需要返回Solutions的字段,提升性能 } ], where: { '$solution.solutionId$': { [Op.is]: null } // 筛选出没有对应Solutions的Orders }, offset: page, limit, })
关键说明
required: false:开启左外连接,默认的include是内连接(只有两边都有匹配才返回),左外连接会返回所有Orders,不管有没有对应的Solutions'$solution.solutionId$':这是Sequelize的关联模型字段引用语法,用来指定关联的Solutions模型的solutionId字段,判断其为null就表示该订单没有对应的解决方案记录attributes: []:如果不需要返回Solutions的任何字段,可以设置为空数组,减少数据传输量
额外注意事项
检查你的模型关联是否正确:
- Orders模型中
hasOne的foreignKey设置为name: 'order',对应Solutions表的order字段,这个是正确的 - Solutions模型的
belongsTo关联中as: "solution"和Orders的as一致,确保关联名称匹配
内容的提问来源于stack exchange,提问作者Duncan
相关产品推荐
相关产品推荐

