自动创建、更新
在创建、更新记录时,GORM 会通过 Upsert 自动保存关联及其引用记录。
user := User{ |
如果您想要更新关联的数据,您应该使用 FullSaveAssociations
模式:
db.Session(&gorm.Session{FullSaveAssociations: true}).Updates(&user) |
跳过自动创建、更新
若要在创建、更新时跳过自动保存,您可以使用 Select
或 Omit
,例如:
user := User{ |
NOTE: 对于 many2many 关联,GORM 在创建连接表引用之前,会先 upsert 关联。如果你想跳过关联的 upsert,你可以这样做:
db.Omit("Languages.*").Create(&user)下面的代码将跳过创建关联及其引用
db.Omit("Languages").Create(&user)
Select/Omit 关联字段
user := User{ |
关联模式
关联模式包含一些在处理关系时有用的方法
// 开始关联模式 |
查找关联
查找所有匹配的关联记录
db.Model(&user).Association("Languages").Find(&languages) |
查找带条件的关联
codes := []string{"zh-CN", "en-US", "ja-JP"} |
添加关联
为 many to many
、has many
添加新的关联;为 has one
, belongs to
替换当前的关联
db.Model(&user).Association("Languages").Append([]Language{languageZH, languageEN}) |
替换关联
用一个新的关联替换当前的关联
db.Model(&user).Association("Languages").Replace([]Language{languageZH, languageEN}) |
删除关联
如果存在,则删除源模型与参数之间的关系,只会删除引用,不会从数据库中删除这些对象。
db.Model(&user).Association("Languages").Delete([]Language{languageZH, languageEN}) |
清空关联
删除源模型与关联之间的所有引用,但不会删除这些关联
db.Model(&user).Association("Languages").Clear() |
关联计数
返回当前关联的计数
db.Model(&user).Association("Languages").Count() |
批量处理数据
关联模式也支持批量处理,例如:
// 查询所有用户的所有角色 |
删除关联记录
默认情况下, gorm.Association <code> 中的 <code> Replace
/Delete
/Clear
操作只会删除关联引用,也就是将旧的关联的外键设置为null。
您可以使用 Unscoped
来删除这些对象(与 ManyToMany
无关)。
删除操作由 gorm.DB
决定。
// 软删除 |
使用选择删除
您可以在删除记录时通过 Select
来删除具有 has one、has many、many2many 关系的记录,例如:
// 删除 user 时,也删除 user 的 account |
注意:只有在待删除记录的主键不为零时,关联关系才会被删除。GORM会将这些主键作为条件来删除选定的关联关系。
// 不会起作用
db.Select("Account").Where("name = ?", "jinzhu").Delete(&User{})
// 会删除所有 name=`jinzhu` 的 user,但这些 user 的 account 不会被删除
db.Select("Account").Where("name = ?", "jinzhu").Delete(&User{ID: 1})
// 会删除 name = `jinzhu` 且 id = `1` 的 user,并且 user `1` 的 account 也会被删除
db.Select("Account").Delete(&User{ID: 1})
// 会删除 id = `1` 的 user,并且 user `1` 的 account 也会被删除
标签 | 描述 |
---|---|
foreignKey | 指定当前模型的列作为连接表的外键 |
references | 指定引用表的列名,其将被映射为连接表外键 |
polymorphic | 指定多态类型,比如模型名 |
polymorphicValue | 指定多态值、默认表名 |
many2many | 指定连接表表名 |
joinForeignKey | 指定连接表的外键列名,其将被映射到当前表 |
joinReferences | 指定连接表的外键列名,其将被映射到引用表 |
constraint | 关系约束,例如:OnUpdate 、OnDelete |