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)
两种方式我都需要一片Book
s,但我只有一片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。
在 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)
两种方式我都需要一片Book
s,但我只有一片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。