Maison >développement back-end >Golang >GORM : deux clés étrangères vers une table
Lorsque nous utilisons GORM pour des opérations de base de données, nous rencontrons souvent des situations où une table doit être associée à deux clés étrangères en même temps. Dans ce cas, comment définir et utiliser correctement les clés étrangères devient un problème qui doit être résolu. Dans cet article, l'éditeur PHP Yuzai présentera en détail comment utiliser GORM pour traiter deux clés étrangères d'une table, ainsi que les précautions associées et les cas d'application pratiques. En étudiant cet article, je pense que tout le monde peut mieux comprendre et utiliser GORM pour les opérations de base de données.
Je souhaite créer trois tableaux : utilisateurs, événements et paires.
Il y aura trois colonnes dans le tableau d'appariement : eventId, user1, user2. Ainsi, user1 et user2 feront référence à la table Users via id.
Je sais comment faire cela en SQL mais je veux essayer d'utiliser un ORM. J'ai lu la documentation mais je ne sais pas comment faire ça
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 }
J'ai essayé de faire quelque chose avec des balises gorm comme celle-ci, mais sans succès :
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"` }
De plus, j'ai essayé quelque chose de similaire et j'ai eu une erreur d'exécution
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
Pour utiliser une autre structure comme clé étrangère, vous devez ajouter son identifiant comme autre champ dans la structure cible, pour votre cas, voici l'exemple de travail (en utilisant exemple 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) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!