Bilakah Saya Harus Menggunakan FirstOrCreate() vs. FirstOrInit() dalam GORM?

Mary-Kate Olsen
Lepaskan: 2024-11-12 03:45:01
asal
892 orang telah melayarinya

When Should I Use FirstOrCreate() vs. FirstOrInit() in GORM?

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

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

Pertanyaan ini diterjemahkan ke dalam pernyataan SQL seperti:

  • BERGABUNG KE... APABILA TIDAK DIPADAKAN MAKA MASUKKAN... APABILA DIPADAKAN MAKA KEMASKINI... (SQL Server)
  • INSERT INTO... ON CONFLICT (...) DO UPDATE SET... (PostgreSQL)
  • MASUKKAN KE DALAM... PADA KEMASKINI KUNCI DUA... (MySQL)

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!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan