Als ich kürzlich GORM verwendete, stellte ich ein Problem fest – die Fremdschlüssel wurden nicht aktualisiert. Als ich den Wert des Fremdschlüsselfelds in der zugehörigen Tabelle aktualisierte, wurde er nicht synchron zur anderen Tabelle aktualisiert. Durch Untersuchungen und Recherchen habe ich herausgefunden, dass dies daran liegt, dass GORM Fremdschlüsselfelder standardmäßig nicht automatisch aktualisiert. Dieses Problem beschäftigt mich schon seit einiger Zeit, deshalb habe ich beschlossen, die Lösung mit allen zu teilen. In diesem Artikel zeige ich Ihnen, wie Sie mithilfe von GORM Fremdschlüsselfelder korrekt aktualisieren, um dieses Problem zu vermeiden.
Ich habe zwei Schreibtische, einer ist ein Unternehmen
type Company struct { Id uuid.UUID `gorm:"column:id;primaryKey;"` CreatedAt time.Time `gorm:"index;column:createdAt"` UpdatedAt time.Time `gorm:"index;column:updatedAt"` Name string `gorm:"column:name" binding:"required"` }
Das andere ist „product_entitlement“
type ProductEntitlement struct { ID uuid.UUID CreatedAt time.Time `gorm:"index;column:createdAt"` UpdatedAt time.Time `gorm:"index;column:updatedAt"` Type string `gorm:"column:type" binding:"required"` CompanyID uuid.UUID `gorm:"column:companyId;size:36"` Company Company `gorm:"foreignKey:CompanyID"` }
CompanyID ist ein Fremdschlüssel. CompanyID enthält den Wert von Company.Id
Nachdem das Update-Einfügen abgeschlossen ist, werden jedes Mal neue Zeilen eingefügt. Dies ist der Code, den wir verwenden
func UpdateEntitlement(c *gin.Context) { cid := c.Param("companyId") id := c.Param("entitlementId") eid := uuid.MustParse(id) log.Println(eid) uid := uuid.MustParse(cid) log.Println(uid) var entitlementRequest entities.ProductEntitlement if err := c.BindJSON(&entitlementRequest); err != nil { log.Println(err) fmt.Println("ERROR: ", err) c.JSON(400, gin.H{"error": "Invalid JSON format"}) return } if err := database.DB.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, UpdateAll: true, }).Create(&entitlementRequest).Error; err != nil { log.Println(err) } }
Aber es schlägt immer fehl und gibt einen Fehler aus
BD820BD3F94A2A45E18ED8E8094EF395Ich möchte Product_entitlement aktualisieren, wenn die ID vorhanden ist, andernfalls eine neue erstellen
Die URL lautet wie folgt: http://localhost:8080/company/{{companyId}}/product/{{companyId}} und verwenden Sie die PUT-Methode Der Körper ist
{"type": "auto"}
Wenn es jemandem hilft, können wir mit der FirstOrCreate
-Funktion prüfen, ob die ID existiert, und sie aktualisieren, andernfalls eine neue erstellen.
Um einen Fremdschlüssel zuzuweisen, müssen wir den Wert der zugehörigen Tabelle zuweisen,
entitlementRequest.CompanyID = uid
func UpdateEntitlement(c *gin.Context) { cid := c.Param("companyId") uid := uuid.MustParse(cid) eid := c.Param("entitlementId") nid := uuid.MustParse(eid) var entitlementRequest entities.ProductEntitlement entitlementRequest.CompanyID = uid if err := c.BindJSON(&entitlementRequest); err != nil { fmt.Println("ERROR: ", err) c.JSON(400, gin.H{"error": "Invalid JSON format"}) return } if err := database.DB.Where("id = ?", nid). Assign(entitlementRequest). FirstOrCreate(&entitlementRequest).Error; err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Record not found!"}) return } c.JSON(http.StatusOK, gin.H{"error": "Product entitlement upserted successfully"}) }
Das obige ist der detaillierte Inhalt vonFremdschlüssel in GORM nicht aktualisiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!