Apabila menggunakan GORM untuk operasi pangkalan data, kami sering menghadapi situasi di mana jadual perlu dikaitkan dengan dua kunci asing pada masa yang sama. Dalam kes ini, cara menetapkan dan menggunakan kunci asing dengan betul menjadi masalah yang perlu diselesaikan. Dalam artikel ini, editor PHP Yuzai akan memperkenalkan secara terperinci cara menggunakan GORM untuk memproses dua kunci asing jadual, serta langkah berjaga-jaga yang berkaitan dan kes aplikasi praktikal. Dengan mengkaji artikel ini, saya percaya semua orang boleh memahami dan menggunakan GORM dengan lebih baik untuk operasi pangkalan data.
Saya ingin mencipta tiga jadual: pengguna, acara dan pasangan.
Akan terdapat tiga lajur dalam jadual gandingan: eventId, user1, user2. Jadi pengguna1 dan pengguna2 akan merujuk jadual Pengguna melalui id.
Saya tahu cara melakukan ini dalam sql, tetapi saya ingin mencuba menggunakan ORM. Saya telah membaca dokumentasi tetapi saya tidak tahu bagaimana untuk melakukan ini
type User struct { Id uint64 `gorm:"primarykey"` TGtag string IsActive bool } type RCEvent struct { Id uint64 `gorm:"primarykey"` DateStarted time.Time IsActive bool } type Pair struct { EventId uint64 UserID1 uint64 UserID2 uint64 }
Saya cuba melakukan sesuatu dengan tag gorm seperti ini, tetapi tidak berjaya:
type User struct { Id uint64 `gorm:"primarykey"` TGtag string IsActive bool } type RCEvent struct { Id uint64 `gorm:"primarykey"` DateStarted time.Time IsActive bool Pairs []Pair `gorm:"many2many:pair;"` } type Pair struct { EventId uint64 `gorm:"primarykey"` UserID1 uint64 `gorm:"primarykey"` UserID2 uint64 `gorm:"primarykey"` }
Juga, saya mencuba sesuatu yang serupa dan mendapat ralat masa jalan
type User struct { Id uint64 `gorm:"primarykey"` TGtag string IsActive bool } type RCEvent struct { Id uint64 `gorm:"primarykey"` DateStarted time.Time IsActive bool } type Pair struct { Event RCEvent User1 User //`gorm:"foreignkey:UserId"` User2 User //`gorm:"foreignkey:UserId"` }
[error] failed to parse value &db.Pair{Event:db.RCEvent{Id:0x0, DateStarted:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), IsActive:false}, User1:db.User{Id:0x0, TGtag:"", IsActive:false}, User2:db.User{Id:0x0, TGtag:"", IsActive:false}}, got error invalid field found for struct untitledPetProject/internal/db.Pair's field Event: define a valid foreign key for relations or implement the Valuer/Scanner interface
Untuk menggunakan struktur lain sebagai kunci asing, anda harus menambah idnya sebagai medan lain dalam struktur sasaran, untuk kes anda di sini ialah contoh yang berfungsi (menggunakan contoh gorm):
package main import ( "log" "time" "gorm.io/driver/sqlite" "gorm.io/gorm" ) type User struct { gorm.Model ID uint64 `gorm:"primarykey"` TGtag string IsActive bool } type RCEvent struct { gorm.Model ID uint64 `gorm:"primarykey"` DateStarted time.Time IsActive bool } type Pair struct { gorm.Model ID uint64 `gorm:"primarykey"` EventID uint64 Event RCEvent User1ID uint64 User1 User User2ID uint64 User2 User } func main() { db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("failed to connect database") } // Migrate the schema err = db.AutoMigrate(&User{}) if err != nil { log.Fatal(err) } err = db.AutoMigrate(&RCEvent{}) if err != nil { log.Fatal(err) } err = db.AutoMigrate(&Pair{}) if err != nil { log.Fatal(err) } // Create user1 := User{ID: 2, TGtag: "mohammad"} user2 := User{ID: 3, TGtag: "ali"} event := RCEvent{ID: 2} pair := Pair{ID: 2, EventID: 2, Event: event, User1ID: 2, User1: user1, User2ID: 3, User2: user2} db.Create(&user1) db.Create(&user2) db.Create(&event) db.Create(&pair) // Read var user User db.First(&user, 3) // find product with integer primary key db.First(&user, "t_gtag = ?", "ali") // find product with code D42 // Update - update product's price to 200 db.Model(&user).Update("is_active", false) // Update - update multiple fields db.Model(&user).Updates(User{ID: 4, TGtag: "ahmad"}) // non-zero fields db.Model(&user).Updates(map[string]interface{}{"Id": 5, "TGtag": "hasan"}) // Delete - delete product db.Delete(&user, 2) }
Atas ialah kandungan terperinci GORM: dua kunci asing ke meja. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!