【问题标题】:GORM update associations by ids onlyGORM 仅通过 id 更新关联
【发布时间】:2021-07-07 10:12:47
【问题描述】:

在 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)

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

那么我该怎么做呢?

【问题讨论】:

    标签: sqlite go go-gorm


    【解决方案1】:

    您可以像这样从 ID 创建[]*Book

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-12
      • 2018-01-29
      • 2020-11-20
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      相关资源
      最近更新 更多