我们在日常工作当中经常遇到一对一和一对多的关系,那么在gorm中我们是怎么使用的呢?听我细细道来。 首先我们定义email、user和mobile三张表,他们对应的结构体如下:
Email表
代码语言:javascript复制package models
type Email struct {ModelAddress stringUserId uint}
Mobile表
代码语言:javascript复制package models
type Mobile struct {ModelAddress string `json:"address"`UserId uint}
user表
代码语言:javascript复制package models
type User struct {ModelName stringAge uintMobile MobileEmailSlice []Email}
主程序
代码语言:javascript复制package main
import ("ginLearn.com/models")
func main() {db := models.DB()user := models.User{}user.ID = 1mobile := models.Mobile{}//一个人拥有一个手机号码//SELECT * FROM `mobiles` WHERE `mobiles`.`deleted_at` IS NULL AND ((`user_id` = 1))//我们手动指定了关联字段//自定关联字段db.Model(&user).Related(&mobile, "userId")//自动关联//db.Model(&user).Related(&mobile)
//一个人拥有多个邮箱//一对多的情况要定义一个切片var emailSlice []models.Email//自定关联字段// SELECT * FROM `emails` WHERE `emails`.`deleted_at` IS NULL AND ((`user_id` = 1))db.Model(&user).Related(&emailSlice, "userId")//自动关联//db.Model(&user).Related(&emailSlice)}
一对一和一对多的关系并不复杂,就像示例当中,我们只需要明确对应关系,gorm会自动给我们找到对应关系。这里需要强调一下一对多的使用。
代码语言:javascript复制//一对多的情况要定义一个切片var emailSlice []models.Email//自定关联字段// SELECT * FROM `emails` WHERE `emails`.`deleted_at` IS NULL AND ((`user_id` = 1))db.Model(&user).Related(&emailSlice, "userId")
一定不要忘记了,一对多返回的应该是个切片,如果你不传入切片,那么gorm会把把结果的最后一个值放进切片中给你返回!
链接:https://pan.baidu.com/s/1DRyMeG0Cwz3BWIyGWPhDNw
提取码:ek0b