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

如何使用Objection.js在多对多关联表中插入额外字段值?

多对多关联场景下:插入Bar数据并关联已有Foo记录的正确实现

先明确你的数据表结构

你拥有三个关联表,结构如下:

  • foo表
    字段
    id
  • bar表
    字段
    id
    data
  • foo_bar(多对多关联表)
    字段
    foo_id
    bar_id
    num
    desc

你的需求很清晰:向bar表插入一条新数据,同时通过foo_bar关联表,把这条新bar记录和foo表中id=2的已有记录绑定起来。

你当前代码的问题

你现有的upsertGraph调用存在几个明显问题:

  1. allowInsert的参数格式错误,应该传入关系名称的数组,而非带括号的字符串
  2. 要关联的foo id写的是1,不是你需要的2
  3. 传入的对象结构不正确,关联关系应该作为对象的属性存在,而非数组形式

修正后的完整实现

首先确保你的Bar模型的relationMappings配置正确(多对多关联的关键):

static get relationMappings() {
  return {
    // 多对多关联建议用复数命名,语义更清晰
    foos: {
      relation: Model.ManyToManyRelation,
      modelClass: require('./Foo'), // 替换成你的Foo模型实际路径
      join: {
        from: 'bar.id',
        through: {
          from: 'foo_bar.bar_id',
          to: 'foo_bar.foo_id',
          extra: ['num', 'desc'] // 关联表的额外字段要在这里声明
        },
        to: 'foo.id'
      }
    }
  };
}

然后用正确的upsertGraph写法来实现需求:

await Bar.query()
  .allowInsert(['foos']) // 允许操作关联的foos关系
  .upsertGraph(
    {
      data: 'todo', // bar表要插入的data字段值
      foos: [{ id: 2 }] // 指定要关联的foo记录id为2
    },
    { 
      relate: true, // 仅创建关联记录,不修改foo表本身
      insertMissing: true // 允许插入新的bar记录(upsert默认支持更新/插入)
    }
  );

额外补充:给关联表字段赋值

如果需要给foo_bar表的num和desc字段设置值,可以直接在关联对象中添加这些字段:

await Bar.query()
  .allowInsert(['foos'])
  .upsertGraph(
    {
      data: 'todo',
      foos: [{ id: 2, num: 5, desc: '这是一条关联备注' }]
    },
    { relate: true, insertMissing: true }
  );

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:34:19