Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kunci asing dalam GORM tidak dikemas kini

Kunci asing dalam GORM tidak dikemas kini

WBOY
WBOYke hadapan
2024-02-09 11:57:071051semak imbas

GORM 中的外键未更新

Semasa saya menggunakan GORM baru-baru ini, saya mendapati masalah - kunci asing tidak dikemas kini. Apabila saya mengemas kini nilai medan kunci asing dalam jadual yang berkaitan, ia tidak dikemas kini secara serentak ke jadual lain. Melalui penyiasatan dan penyelidikan, saya mendapati bahawa ini adalah kerana GORM tidak mengemas kini medan kunci asing secara automatik secara lalai. Masalah ini telah mengganggu saya untuk seketika, jadi saya memutuskan untuk berkongsi penyelesaiannya dengan semua orang. Dalam artikel ini, saya akan menunjukkan kepada anda cara menggunakan GORM untuk mengemas kini medan kunci asing dengan betul untuk mengelakkan masalah ini.

Isi soalan

Saya ada dua meja, satu syarikat

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

Yang satu lagi ialah 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 ialah kunci asing. CompanyID mengandungi nilai daripada Company.Id

Selepas sisipan kemas kini selesai, baris baharu akan dimasukkan setiap kali. Ini adalah kod yang kami gunakan

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

Tetapi ia sentiasa gagal dan memberikan kesilapan

BD820BD3F94A2A45E18ED8E8094EF395

Saya ingin mengemas kini Product_entitlement jika ID itu wujud, jika tidak, buat yang baharu

URL adalah seperti berikut, http://localhost:8080/company/{{companyId}}/product/{{companyId}} dan gunakan kaedah PUT Badan adalah

{"type": "auto"}

Penyelesaian

Jika ia membantu seseorang, kita boleh menggunakan fungsi FirstOrCreate untuk menyemak sama ada id itu wujud dan mengemas kininya, jika tidak mencipta yang baharu.

Untuk menetapkan kunci asing, kita perlu menetapkan nilai pada jadual yang berkaitan,

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

Atas ialah kandungan terperinci Kunci asing dalam GORM tidak dikemas kini. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam