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

如何用Sequelize查询未关联Solutions记录的Orders数据?

解决方法

你的需求是获取没有对应Solutions记录的Orders,核心是用左外连接查询,然后筛选出关联Solutions不存在的订单。你原来的查询逻辑存在两个问题:

  1. Op.notIn中直接使用Solutions.findAll会因为异步操作返回Promise,无法生成正确的SQL语句
  2. 逻辑方向错误:你需要的是「没有关联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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:40:31