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

Fremdschlüssel in GORM nicht aktualisiert

WBOY
WBOYnach vorne
2024-02-09 11:57:071049Durchsuche

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

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

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen