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

如何在Sequelize中使用Op.OR查询两个关联模型

解决Sequelize关联模型Op.OR查询的"missing FROM-clause entry"错误

问题原因

你直接在Orcamento的主where条件中引用了关联模型Pessoa和Contato的字段,但没有通过include将这两个关联模型加入查询的JOIN子句,导致数据库找不到对应的表,因此抛出"missing FROM-clause entry for table 'Pessoa'"错误。

解决方案

必须先通过include加载关联模型,再在where中使用关联字段构建OR查询,以下是两种可行写法:

写法一:主where中直接用关联字段(推荐)

const { Op } = require('sequelize');

Orcamento.findAll({
  // 必须include关联模型,让Sequelize生成JOIN语句
  include: [
    { model: Pessoa, required: false }, // required: false 表示左连接,保留无关联的Orcamento
    { model: Contato, required: false }
  ],
  where: {
    [Op.OR]: [
      { '$Pessoa.nome$': { [Op.like]: '%你的搜索词%' } },
      { '$Contato.nome$': { [Op.like]: '%你的搜索词%' } }
    ]
  }
});

写法二:将条件分散到include的where中

如果需要更精细控制关联模型的查询条件,可以把过滤逻辑放到对应关联模型的where中,再通过主模型的where筛选出至少匹配一个关联条件的记录:

const { Op } = require('sequelize');

Orcamento.findAll({
  include: [
    {
      model: Pessoa,
      required: false,
      where: { nome: { [Op.like]: '%你的搜索词%' } }
    },
    {
      model: Contato,
      required: false,
      where: { nome: { [Op.like]: '%你的搜索词%' } }
    }
  ],
  where: {
    [Op.OR]: [
      { '$Pessoa.id$': { [Op.ne]: null } }, // 匹配到Pessoa的记录
      { '$Contato.id$': { [Op.ne]: null } } // 匹配到Contato的记录
    ]
  }
});

注意事项

  • required: false:使用左连接,确保即使Orcamento没有关联的Pessoa/Contato,只要满足其中一个条件就会返回;如果设为true,会变成内连接,仅返回同时存在关联的记录,根据业务需求调整。
  • 关联字段的引用格式:必须用$关联模型名.字段名$的格式,或者使用Sequelize模型的属性(如[Pessoa.nome]),两种写法效果一致。

内容的提问来源于stack exchange,提问作者LiNkIeZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:55:14