如何使用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调用存在几个明显问题:
allowInsert的参数格式错误,应该传入关系名称的数组,而非带括号的字符串- 要关联的foo id写的是1,不是你需要的2
- 传入的对象结构不正确,关联关系应该作为对象的属性存在,而非数组形式
修正后的完整实现
首先确保你的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
相关产品推荐
相关产品推荐

