【发布时间】:2021-09-14 07:51:27
【问题描述】:
我正在尝试使用 golang、gin、gorm 创建简单的后端 RestAPI。我有点迷失在这里。 我想使用以下有效负载在 DB 上创建新记录 请参考以下代码
这是我从前端获取的示例负载 - React
{
"logged_user": {
"user_id": "2350e6aa-ee3d-11eb-8d84-1e00d1365135",
"full_name": "demo1",
"email": "sample@gmail.com",
"role": "admin"
},
"employee_detail": [
{
"from_address": "chennai-102",
"to_address": "chennai-17",
"emp_id": "071bdd76-0b36-11ed-9a05-0242ac130003",
"emp_date": "07/29/2021",
"reason": "dinner",
"comments": "this is comments field ponnamalle"
},
{
"from_address": "chennai-102",
"to_address": "chennai-17",
"emp_id": "071bdd76-0b36-11ed-9a05-0242ac13000",
"emp_date": "07/29/2021",
"reason": "dinner",
"comments": "this is comments field"
},
]
}
这是 emp 模型,我创建了用于生成 UUID 的基本类型 模型.go
type Base struct {
gorm.Model
ID string `gorm:"primary_key;not_null" json:"id"`
}
type Emp struct {
Base
LoggedUser LoggedUser `gorm:"embedded" json:"logged_user"`
EmpDetail []struct {
EmpId string `gorm:"not_null;" json:"Emp_id"`
Date string `gorm:"size:255;not_null;" json:"date"`
FromAddress string `gorm:"size:255;not_null;" json:"from_address"`
ToAddress string `gorm:"size:255;not_null;" json:"to_address"`
Reason string `gorm:"size:255;not_null;" json:"reason"`
Comments string `gorm:"size:255;not_null;" json:"comments"`
} `gorm:"foreignKey:TripId;" json:"emp_detail"`
}
CreateEmp for Unmarshall the bdoy 并准备 bodyto saveEmp
controller.go
func (server *Server) CreateEmp(context *gin.Context) {
errMessage := map[string]string{}
body, err := ioutil.ReadAll(context.Request.Body)
var emp models.Emp
if err != nil {
errMessage["Invalid Request"] = "Invalid Request"
context.JSON(http.StatusUnprocessableEntity, gin.H{
"status": http.StatusUnprocessableEntity,
"error": errMessage,
})
return
}
err = json.Unmarshal([]byte(body), &emp)
if err != nil {
errMessage["Unable to Unmarshall"] = "Unable to unmarshal"
context.JSON(http.StatusUnprocessableEntity, gin.H{
"status": http.StatusUnprocessableEntity,
"error": errMessage,
})
return
}
createdEmp, err := emp.SaveEmp(server.DB)
if err != nil {
context.JSON(http.StatusInternalServerError, gin.H{
"status": http.StatusInternalServerError,
"error": err.Error(),
})
return
}
context.JSON(http.StatusOK, gin.H{
"status": http.StatusOK,
"response": createdEmp,
})
}
最后将创建记录的方法保存到数据库。 saveEmp 方法
func (emp *Emp) SaveEmp(db *gorm.DB) (*Emp, error) {
if err := db.Debug().Create(&emp).Error; err != nil {
return &Emp{}, err
}
return emp, nil
}
当我尝试创建新记录时,使用上面的代码。它仅使用 loggedUser 字段创建空记录。请参考下图
提前致谢。
【问题讨论】:
-
您是否尝试将登录的用户信息嵌入到员工表列中?因为
embedded标签就是它的作用。通过您的屏幕截图,我看到您有一个用于登录用户详细信息的不同表格。 -
感谢@SpirosI.Economakis。是的,我想将登录的用户信息存储在员工表中。而上面的截图其实是员工表。
-
现在我有点困惑。如果这是员工表,
from_address、to_address等字段在哪里,而您错过了将保存嵌入数据的logged_user字段。