Heim > Backend-Entwicklung > Golang > Fremdschlüssel in GORM nicht aktualisiert

Fremdschlüssel in GORM nicht aktualisiert

WBOY
Freigeben: 2024-02-09 11:57:07
nach vorne
1099 Leute haben es durchsucht

GORM 中的外键未更新

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.

Frageninhalt

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"`
}
Nach dem Login kopieren

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"`
}
Nach dem Login kopieren

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)
    }
}
Nach dem Login kopieren

Aber es schlägt immer fehl und gibt einen Fehler aus

BD820BD3F94A2A45E18ED8E8094EF395

Ich 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"}

Workaround

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"})
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage