1. 关联

    GORM 将在创建或保存一条记录的时候自动保存关联和它的引用,如果关联有一个主键, GORM 将调用 来更新它, 不然,它将会被创建。

    1.2. 关闭自动更新

    如果你的关联记录已经存在在数据库中, 你可能会不想去更新它。

    你可以设置 gorm:association_autoupdatefalse

    1. // 不更新有主键的关联,但会更新引用
    2. db.Set("gorm:association_autoupdate", false).Create(&user)
    3. db.Set("gorm:association_autoupdate", false).Save(&user)

    或者使用 GORM 的标签, gorm:"association_autoupdate:false"

    1. type User struct {
    2. gorm.Model
    3. Name string
    4. CompanyID uint
    5. Company Company `gorm:"association_autoupdate:false"`
    6. }

    即使你禁用了 AutoUpdating, 仍然会创建没有主键的关联,并保存它的引用。

    1. // 不创建没有主键的关联,不保存它的引用。
    2. db.Set("gorm:association_autocreate", false).Create(&user)
    3. db.Set("gorm:association_autocreate", false).Save(&user)

    或者使用 GORM 标签, gorm:"association_autocreate:false"

    1. gorm.Model
    2. Name string
    3. // 不创建没有主键的关联,不保存它的引用。
    4. Company1 Company `gorm:"association_autocreate:false"`
    5. }

    1.4. 关闭自动创建/更新

    禁用 AutoCreateAutoUpdate,你可以一起使用它们两个的设置。

    或者使用 gorm:save_associations

    1. db.Set("gorm:save_associations", false).Create(&user)
    2. db.Set("gorm:save_associations", false).Save(&user)
    3. type User struct {
    4. gorm.Model
    5. Name string
    6. Company Company `gorm:"association_autoupdate:false"`
    7. }

    如果你不想当更新或保存数据的时候保存关联的引用, 你可以使用下面的技巧

    1. db.Set("gorm:association_save_reference", false).Create(&user)

    或者使用标签

    1. type User struct {
    2. gorm.Model
    3. CompanyID uint
    4. Company Company `gorm:"association_save_reference:false"`
    5. }

    1.6. 关联模式

    1. // 开启关联模式
    2. var user User
    3. db.Model(&user).Association("Languages")
    4. // `user` 是源表,必须包含主键
    5. // `Languages` 是源表关系字段名称。
    6. // 只有上面两个条件都能匹配,关联模式才会生效, 检查是否正常:
    7. // db.Model(&user).Association("Languages").Error

    查找匹配的关联

    1.6.2. 增加关联

    many to manyhas many 新增关联, 为 has one, belongs to 替换当前关联

    1. db.Model(&user).Association("Languages").Append([]Language{languageZH, languageEN})
    2. db.Model(&user).Association("Languages").Append(Language{Name: "DE"})

    用一个新的关联替换当前关联

    1. db.Model(&user).Association("Languages").Replace([]Language{languageZH, languageEN})
    2. db.Model(&user).Association("Languages").Replace(Language{Name: "DE"}, languageEN)

    1.6.4. 删除关联

    删除源和参数对象之间的关系, 只会删除引用,不会删除他们在数据库中的对象。

    1. db.Model(&user).Association("Languages").Delete([]Language{languageZH, languageEN})

    删除源和当前关联之间的引用,不会删除他们的关联

    1.6.6. 统计关联