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

Objection.js的relationMapping中如何对同字段筛选两个不同值

失效原因

  • 第一种写法field1: [null, 0]生成的SQL为field1 IN (null, 0),SQL语法中NULL不能通过IN运算符匹配,NULL和任何值的等值比较结果都为unknown,因此匹配不到值为NULL的记录。
  • 第二种写法同一个键field1重复定义,JS对象的同名键会被后定义的内容覆盖,最终过滤规则只保留field1: [0],自然无法匹配NULL。

正确实现方式

Objection.js的关联过滤filter属性支持传入回调函数接收查询构建器,你可以手动组合or条件实现需求,示例如下:

static get relationMappings() {
  return {
    dipendenti: {
      relation: Model.ManyToManyRelation,
      modelClass: path.join(__dirname, '/DestModel'),
      // 替换原来的对象形式filter为函数形式
      filter: (query) => {
        query.where((subQuery) => {
          // 匹配field1为0 或者 field1为NULL的记录
          subQuery.where('field1', 0).orWhereNull('field1')
        })
      },
      join: {
        from: `fromField`,
        through: {
          modelClass: path.join(__dirname, '/ThroughModel'),
          from: `throughFromField`,
          to: `throughToField`
        },
        to: `toField`
      }
    }
  };
}

注意事项

  • 如果field1是中间表(ThroughModel)的字段,需要在字段前加上中间表的表名前缀,避免和目标表、源表的同名字段冲突,示例:subQuery.where('through_table.field1', 0).orWhereNull('through_table.field1')
  • 外层嵌套where是为了避免过滤条件和关联本身的join条件逻辑冲突,确保两个field1的判断是作为一个整体的or条件生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 14:45:11