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

Kunci asing dalam GORM tidak dikemas kini

WBOY
Lepaskan: 2024-02-09 11:57:07
ke hadapan
1081 orang telah melayarinya

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"`
}
Salin selepas log masuk

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"`
}
Salin selepas log masuk

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)
    }
}
Salin selepas log masuk

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"})
}
Salin selepas log masuk

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

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan