Gin框架ShouldBind用法与gorm,has many关联的疑问

Code

    r := gin.Default()

    r.GET("/api/v1/get", func(ctx *gin.Context) {
        var query model.User

        ctx.ShouldBind(&query)

        fmt.Println(query)

        // result := db.Get(&query)

        ctx.JSON(http.StatusOK, gin.H{
            "data": query,
        })
    })

    r.Run(":80")

可以解析出关联结构体中的Product字段

type User struct{
    Name string `form:"name"`
    Password string `form:"password"`
    Orders Order
}

type Order struct{
    Product string `form:"product"`
    UserID uint
}

结果:

{
    "data": {
        "Name": "jackson",
        "Orders": {
            "Product": "fish",
            "UserID": 0
        }
    }
}

但是想通过gorm实现has many写法应如下,但是这种写法用Shouldbind方法就不能绑定到Order.Product

type User struct{
    Name string
    Password string
    Orders []Order
}

type Order struct{
    Product string
    UserID uint
}

结果:

{
    "data": {
        "Name": "jackson",
        "Orders": null
    }
}

请指点一种便捷高效的查询方法,当前端传入任意数据,只要匹配设计表中字段(如User或Order中任意字段)则返回所有关联的表数据。练手写项目折腾好几天了,希望能够得到有效答案,感激不尽!

最佳答案

该问题可以看成如何 Gin 将表单参数绑定至有嵌套的结构体中,可以使用 POST + JSON 的方式来实现。

代码修改

main.go

    r := gin.Default()

    // HTTP 请求方法修改
    r.POST("/api/v1/get", func(ctx *gin.Context) {
        var query model.User

        ctx.ShouldBind(&query)

        fmt.Println(query)

        // result := db.Get(&query)

        ctx.JSON(http.StatusOK, gin.H{
            "data": query,
        })
    })

    r.Run(":80")

model.go

type User struct {
    Name     string `form:"name"`
    Password string `form:"password"`
    Orders   []Order // 一个用户会关联多个 Order 
}

验证

  1. 发送请求
    curl --location 'http://localhost:80/api/v1/post'  --header 'Content-Type: application/json'  --data '{
    "name" : "snail",
    "orders": [{"product":"Apple", "userID":1}, {"product":"Banana", "userID":1}]
    }'
  2. 查看响应
    {
     "data":{
         "Name":"snail",
         "Password":"",
         "Orders":[
             {
                 "Product":"Apple",
                 "UserID":1
             },
             {
                 "Product":"Banana",
                 "UserID":1
             }
         ]
     }
    }
1年前 评论
讨论数量: 1

该问题可以看成如何 Gin 将表单参数绑定至有嵌套的结构体中,可以使用 POST + JSON 的方式来实现。

代码修改

main.go

    r := gin.Default()

    // HTTP 请求方法修改
    r.POST("/api/v1/get", func(ctx *gin.Context) {
        var query model.User

        ctx.ShouldBind(&query)

        fmt.Println(query)

        // result := db.Get(&query)

        ctx.JSON(http.StatusOK, gin.H{
            "data": query,
        })
    })

    r.Run(":80")

model.go

type User struct {
    Name     string `form:"name"`
    Password string `form:"password"`
    Orders   []Order // 一个用户会关联多个 Order 
}

验证

  1. 发送请求
    curl --location 'http://localhost:80/api/v1/post'  --header 'Content-Type: application/json'  --data '{
    "name" : "snail",
    "orders": [{"product":"Apple", "userID":1}, {"product":"Banana", "userID":1}]
    }'
  2. 查看响应
    {
     "data":{
         "Name":"snail",
         "Password":"",
         "Orders":[
             {
                 "Product":"Apple",
                 "UserID":1
             },
             {
                 "Product":"Banana",
                 "UserID":1
             }
         ]
     }
    }
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!