Gin开发后端——gorm外键实例
第一次接触Gin和Gorm,遇到了很多坑,分享出来让大家避免。
# 说明
有两个模型:User和Group。Group有一个Owner字段,Owner是指向User的外键。
# model层结构体设计
type UserModel struct {
ID int `json:"id" gorm:"primary_key"`
Username string `gorm:"unique_index"`
Name string `json:"name"`
Password string `json:"password"`
Validation string `json:"-"`
Status int `json:"status"`
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
ID int `json:"id" gorm:"primary_key"`
Name string `json:"name"`
Desc string `json:"desc"`
OwnerID int
Owner UserModel `gorm:"Foreignkey:OwnerID"`
1
2
3
4
5
2
3
4
5
Group中的OwnerID会成为数据库的owner_id字段,成为实际起作用的外键。而Owner属性是用于关联查询的,不会出现在数据库字段中。
注意
请注意,官方说明加上注释gorm:"Foreignkey:OwnerID"
可以在AutoMigrate的时候自动添加外键,但是根据本人亲自实验,没有自动添加,后来发现是自己使用了V1版本的GORM,文档是V2版本的...
在初始化数据库之后,使用DB.Model(&models.GroupModel{}).AddForeignKey("owner_id", "user_models(id)", "CASCADE", "CASCADE")
添加外键关联。
该函数参数为:
- 数据库中需要创建外键的字段名(不是结构体中属性名)
- 外键关联的表(关联的字段)
- 删除的约束
- 更新的约束
# model层中创建函数
创建的过程中我们需要设置ownerID为需要指向的用户,但无需设置Owner属性,因为Owner属性是用于关联查询返回数据的。
# model层查询函数
需要注意的是直接使用DB.Where("id = ?", groupID).First(&group).Error
这样的查询方式,gorm是不会自动填充user的,需要使用DB.Model(&group).Association("owner").Find(&group.Owner)
,其中owner
是结构体中的属性,因为里面已经指定了该属性为外键,且字段为ownerid
。因此使用该函数查询之后,会自动根据外键关联查询出owner并填充到结构体中。
编辑 (opens new window)
上次更新: 2024/12/04, 16:28:16