Rumah > pembangunan bahagian belakang > Golang > GORM: dua kunci asing ke meja

GORM: dua kunci asing ke meja

WBOY
Lepaskan: 2024-02-09 18:33:08
ke hadapan
1116 orang telah melayarinya

GORM: dua kunci asing ke meja

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.

Kandungan soalan

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

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

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

Penyelesaian

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

Atas ialah kandungan terperinci GORM: dua kunci asing ke meja. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan