以下是使用gin框架保存一对多模型的示例代码:
package main
import (
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
gorm.Model
Name string
Email string
Articles []Article // 一个用户可以有多篇文章
}
type Article struct {
gorm.Model
Title string
Content string
UserID uint // 外键,指向User表中的ID字段
}
func main() {
dsn := "username:password@tcp(localhost:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
db.AutoMigrate(&User{}, &Article{})
r := gin.Default()
r.POST("/users", func(c *gin.Context) {
var user User
err := c.ShouldBindJSON(&user)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
result := db.Create(&user)
if result.Error != nil {
c.JSON(500, gin.H{"error": result.Error.Error()})
return
}
c.JSON(200, user)
})
r.POST("/articles", func(c *gin.Context) {
var article Article
err := c.ShouldBindJSON(&article)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
var user User
result := db.First(&user, article.UserID)
if result.Error != nil {
c.JSON(500, gin.H{"error": result.Error.Error()})
return
}
article.UserID = user.ID
result = db.Create(&article)
if result.Error != nil {
c.JSON(500, gin.H{"error": result.Error.Error()})
return
}
c.JSON(200, article)
})
r.GET("/users/:id", func(c *gin.Context) {
var user User
result := db.Preload("Articles").First(&user, c.Param("id"))
if result.Error != nil {
c.JSON(500, gin.H{"error": result.Error.Error()})
return
}
c.JSON(200, user)
})
r.Run()
}
在这个例子中,我们定义了一个User模型和一个Article模型。每个用户可以有多篇文章,因此我们在User结构体中添加了一个Articles切片作为关联字段。同时,在Article结构体中添加了一个UserID字段作为外键,指向User表中的ID字段。
我们使用GORM来保存这些模型,并使用gin框架来处理HTTP请求。在创建文章时,我们需要首先查询到对应的用户并将其ID设置为UserID字段,然后才能保存文章。在获取用户信息时,我们使用GORM的Preload函数来一次性获取到该用户所有的文章信息。
注意,在实际生产环境中,您需要对代码进行更多的错误处理和安全检查。