如何在不创建模型的情况下插入对模型的引用?

How do you insert a reference to a model without creating it?

我的模型 A 可以关联一行或多行模型 B。这种关系只需要一种方式。

我运行:

result = await A.query()
  .where('id', 123) // 123 is an already existing model A
  .insertGraph([
    {
      B: [{id: 456}] // 456 is an already existing model B
    }
   ]);

但是我得到一个错误Key (id)=(456) already exists.

据我了解,Objection 正在尝试创建一个 ID 为 456 的新模型 B,我只想在两行 A:123 和 B:456 之间添加一个关系。

既然你在更新,我就不使用了insertGraph()。可以用 upsertGraph() 使用 refs 来完成。但是这个方法有点复杂,理想情况下我会这样做:

const a = await A
  .query()
  .findById(123);

const numRelatedRows = await a.$relatedQuery('B')
  .relate(456)

使用 upsertGraph(),您将以这种方式关联 child 456,但 child 的其余部分(如果存在) 将不相关 .您可以使用很多选项修改 upsert 的行为,但对我来说 $relatedQuery() 是可行的方法:

const result = await A.upsertGraphAndFetch(
  {
    id: 123,
    B: [
         {#ref: 456} // relate 456, and unrelate the rest, since not present here
       ]
  }
)