问题描述
这是我的结构
type Book struct {
ID uint `json:"id" gorm:"primary_key"`
Yearmonth string `json:"yearmonth"`
Realname string `json:"real_name"`
LanguageId int
Language Language
}
这是我的控制器逻辑
func GetBooks(c *gin.Context) {
db := c.MustGet("db").(*gorm.DB)
var language []models.Language
if err := db.Where("id=?",c.Param("language_id")).First(&language).Error;
err != nil {
c.JSON(http.StatusBadRequest,gin.H{"data": "No Records Found"})
return
}
var books []models.Book
if errBooks := db.Where("language_id=?",c.Param("language_id")).Find(&books).Error;
errBooks != nil {
c.JSON(http.StatusBadRequest,gin.H{"data": "No Books Found"})
return
}
c.JSON(http.StatusOK,gin.H{"data": books})
}
我以几种方式尝试过,结果得到空数据。任何有帮助的建议或帮助。 TIA
解决方法
问题是未从URL解析language_id
。
.Param()用于获取路径中的参数。例如:
router.GET("/user/:id",func(c *gin.Context) {
// a GET request to /user/john
id := c.Param("id") // id == "john"
})
但是您没有指定任何路径参数。您正在传递language_id
作为URL中的查询参数。因此,要获取querystring参数,您需要使用.Query()。例如:
GET /path?id=1234&name=Manu&value=
c.Query("id") == "1234"
c.Query("name") == "Manu"
c.Query("value") == ""
c.Query("wtf") == ""
因此,使用c.Query("language_id")
代替c.Param("language_id")
db.Where("id=?",c.Query("language_id")).First(&language)
db.Where("language_id=?",c.Query("language_id")).Find(&books)