我正在尝试在我的演示API中,在 技能和技能列表之间设置多对多关系。Job[]Skill
作业结构
type Job struct {
ID string `sql:"type:uuid;primary_key;"`
Title string `json:"title,omitempty"`
Skills []*skill.Skill `json:"skills,omitempty"gorm:"many2many:job_skill;"`
CreatedAt time.Time
UpdatedAt time.Time
}
技能结构
type Skill struct {
gorm.Model
Name string `json:"name,omitempty"`
}
然后,我使用 自动生成联接表。gorm.DB.AutoMigrate()
当我向我的 API 发送请求时,数据在第一次时就会正确创建,并且联接表会按预期方式填充。POST
示例数据POST
{
"title": "Senior Python Engineer",
"skills": [{"name": "javascript"}, {"name": "python"}]
}
但是,当我发送添加新技能的请求时,它会复制技能表中的技能,然后在联接表中为已存在的技能创建新记录。PATCH
示例数据PATCH
{
"title": "Lead Engineer",
"skills": [{"name": "javascript"}, {"name": "python"}, {"name": "management"}]
}
对数据执行 get 请求将显示以下内容:
{
"title": "Lead Engineer",
"skills": [{"name": "javascript"}, {"name": "python"}, {"name": "javascript"}, {"name": "python"}, {"name": "management"}]
}
我也尝试过设置所击中的技能,但是当添加新技能时,它失败了,因为它说另外两个已经存在,这很好,但随后不会添加新的技能。gorm:"unique"Name
我假设我只能发回新值?不是整个列表?
为了清楚起见,我的一些Go代码
func GetJobs(w http.ResponseWriter, r *http.Request) {
j := &[]Job{}
o := database.DB.Preload("Skills").Find(&j)
render.JSON(w, r, o)
}
func UpdateJob(w http.ResponseWriter, r *http.Request) {
j := &Job{}
err := json.NewDecoder(r.Body).Decode(j)
if err != nil {
return
}
o := database.DB.Model(&j).Where("id = ?", j.ID).Update(&j)
render.JSON(w, r, o)
}
眼眸繁星
繁花如伊
相关分类