Heim > Backend-Entwicklung > Golang > GORM: zwei Fremdschlüssel zu einer Tabelle

GORM: zwei Fremdschlüssel zu einer Tabelle

WBOY
Freigeben: 2024-02-09 18:33:08
nach vorne
1117 Leute haben es durchsucht

GORM: zwei Fremdschlüssel zu einer Tabelle

Bei der Verwendung von GORM für Datenbankoperationen kommt es häufig vor, dass einer Tabelle gleichzeitig zwei Fremdschlüssel zugeordnet werden müssen. In diesem Fall wird die korrekte Festlegung und Verwendung von Fremdschlüsseln zu einem Problem, das gelöst werden muss. In diesem Artikel stellt der PHP-Editor Yuzai ausführlich vor, wie man mit GORM zwei Fremdschlüssel einer Tabelle verarbeitet, sowie entsprechende Vorsichtsmaßnahmen und praktische Anwendungsfälle. Durch das Studium dieses Artikels glaube ich, dass jeder GORM besser verstehen und für Datenbankoperationen verwenden kann.

Frageninhalt

Ich möchte drei Tabellen erstellen: Benutzer, Ereignisse und Paare.

Die Paarungstabelle enthält drei Spalten: eventId, user1, user2. Benutzer1 und Benutzer2 verweisen also über die ID auf die Benutzertabelle.

Ich weiß, wie man das in SQL macht, aber ich möchte es mit einem ORM versuchen. Ich habe die Dokumentation gelesen, weiß aber nicht, wie das geht

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
}
Nach dem Login kopieren

Ich habe versucht, etwas mit Gorm-Tags wie diesem zu machen, aber ohne Erfolg:

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"`
}
Nach dem Login kopieren

Außerdem habe ich etwas Ähnliches versucht und einen Laufzeitfehler erhalten

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"`
}
Nach dem Login kopieren
[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
Nach dem Login kopieren

Workaround

Um eine andere Struktur als Fremdschlüssel zu verwenden, sollten Sie deren ID als weiteres Feld in der Zielstruktur hinzufügen. Für Ihren Fall ist hier das Arbeitsbeispiel (unter Verwendung des gorm-Beispiels):

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)
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonGORM: zwei Fremdschlüssel zu einer Tabelle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage