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.
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
BD820BD3F94A2A45E18ED8E8094EF395Saya 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"}
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!