Buat atau Kemas Kini Rekod dengan GORM
GORM menawarkan dua kaedah untuk mengurus rekod dalam pangkalan data anda: FirstOrCreate() dan FirstOrInit(). Walau bagaimanapun, kadangkala anda mungkin menghadapi senario di mana anda perlu membezakan antara mencipta dan mengemas kini rekod.
Menyemak Penciptaan Rekod
FirstOrCreate() percubaan untuk mencari berdasarkan rekod pada kriteria yang ditetapkan. Jika ia wujud, ia mengembalikan rekod sedia ada. Jika ia tidak wujud, ia mencipta rekod baharu dan mengembalikan rekod yang baru dibuat.
Untuk menyemak sama ada rekod benar-benar dibuat, anda boleh menggunakan kaedah Cipta dalam transaksi. Jika transaksi berjaya, rekod telah dibuat. Jika transaksi gagal, ini bermakna rekod telah wujud dan tidak dibuat.
func CreateOrUpdateRecord(tx *gorm.DB, record *Model) error { if err := tx.Create(record).Error; err != nil { return err // Record already exists } return nil // Record created }
Upsert dengan GORM
Sehingga GORM 1.20.x, ciri yang mudah dipanggil "Upsert" tersedia. Ia menggabungkan kefungsian CreateOrUpdateRecord dengan menyediakan mekanisme "Upsert-On-Conflict" yang serasi.
// Update columns to new value on `id` conflict tx.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, // key column DoUpdates: clause.AssignmentColumns([]string{"name", "age"}), // columns needed to be updated }).Create(&users)
Pertanyaan ini diterjemahkan ke dalam pernyataan SQL seperti:
FirstOrInit vs. FirstOrCreate
Adalah penting untuk ambil perhatian bahawa FirstOrInit() dan FirstOrCreate() menyediakan tujuan yang berbeza. FirstOrInit() memulakan struct tetapi tidak mencipta rekod dalam pangkalan data. FirstOrCreate(), sebaliknya, akan mencipta rekod dan kemudian menanyakannya ke dalam struct yang disediakan.
Atas ialah kandungan terperinci Bilakah Saya Harus Menggunakan FirstOrCreate() vs. FirstOrInit() dalam GORM?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!