GORM 仅通过 id 更新关联

GORM update associations by ids only

在 GORM 中,我希望能够仅使用一部分 ID 来更新模型的关联。

例如,当我有以下结构时:

type Library struct {
    gorm.Model
    Books []*Book
}

type Book struct {
    ID          uint
    Library     *Library
    LibraryID   uint
}

我可以像这样更新“书籍”关系:

books := []*Book{} // filled somewhere else
library := &Library{} // filled somwhere else

library.Books = books
db.Save(library)

或者像这样:

books := []*Book{} // filled somewhere else
library := &Library{} // filled somwhere else

db.
    Model(library).
    Association("Books").
    Replace(books)

两种方式我都需要一片Books,但我只有一片ID。我当然可以先加载书籍,然后将其传递给 Replace 函数:

var ids []uint
books := []*Book{}
db.Find(&books, ids)
db.Model(&Library{}).Association("Books").Replace(books)

但我不想那样做,因为我知道可以发送单个查询来更新关联。

那我该怎么做呢?

您可以通过这样的 ID 创建 []*Book

var ids []uint
books := make([]*Book, len(ids))
for i, id := range ids {
   books[i] = &Book{ID: id}
}

现在您将拥有一片只有 ID 的图书,但这就是 gorm 填充关联所需的全部内容:

db.
    Model(library).
    Association("Books").
    Replace(books)

您将依赖于任何数据库级外键约束来确保您要替换的 ID 实际上是有效的图书 ID。