GORM从JoinTable中获取数据

xdnvmnnf  于 2022-12-16  发布在  Go
关注(0)|答案(1)|浏览(214)

我有一个自定义的JoinTable,我试图从其中获取数据,我尝试了所有我能想到的方法,但是没有任何进展。
这就是我想做的

type Race struct {
    ID             uint      `gorm:"primaryKey" json:"id"`
    ChampionshipId uint      `gorm:"not null" json:"championshipId"`
    Name           string    `gorm:"size:255;not null" json:"name"`
    Date           time.Time `gorm:"size:255;not null" json:"date"`
    Finished       bool      `gorm:"not null" json:"finished"`
    Drivers        []Driver  `gorm:"many2many:race_drivers;" json:"drivers"`
}

我的模型Race有一个Drivers,它是一个drivers数组,这是drivers的样子

type Driver struct {
    ID   uint   `gorm:"primaryKey" json:"id"`
    Name string `gorm:"size:255;not null" json:"name"`
}

但是因为我需要一些额外的数据,所以我创建了一个自定义JoinTable来添加这些数据

type RaceDriver struct {
    RaceID   uint `gorm:"primaryKey" json:"race_id"`
    DriverID uint `gorm:"primaryKey" json:"driver_id"`
    Position int  `json:"position"`
    Laps     int  `json:"points"`
}

func (driver *RaceDriver) BeforeSave(db *gorm.DB) error {
    driver.Position = 0
    driver.Laps = 0
    return nil
}

但是,当调用DB.Preload("Drivers").First(&race, id)时,它只返回赛车的ID和车手的姓名,而不是来自JoinTable的数据
此外,在我的数据库设置中,我在自动迁移DB.SetupJoinTable(&Race{}, "Drivers", &RaceDriver{})之前具有包含正确信息的SetupJoinTable
我试过这样的方法

DB.Preload("Drivers", func(db *gorm.DB) *gorm.DB {
        return db.Joins("INNER JOIN race_drivers ON race_drivers.drivers_id = drivers.id")
    }).Find(&r)

得到了这个错误cannot convert 0xabec80 to Int4 SELECT * FROM "drivers" WHERE "drivers"."id" IN (1,2,3,4,5,6) AND "drivers"."id" = '0xabec80'
我将所有主键切换为uint 64|单位|int 64和int,它们不起作用.
我也尝试过在没有预加载的情况下使用select和join,或者在有预加载的情况下使用select和join,但都不起作用,因为我试图获取对象数组。
我被困在这上面这么久真是疯了。任何提示都会很有帮助的!

bq9c1y66

bq9c1y661#

听起来像是在尝试使用GORM的Preload方法从RaceDriver连接表中快速加载额外的数据,但是Preload只适用于从“多对一”或“多对多”关系的“多”端加载数据,而不适用于从连接表加载数据。
要从联接表加载数据,需要使用不同的方法,例如JoinsScopes。以下是如何使用JoinsRaceDriver表加载数据的示例:
复制代码

DB.Joins("INNER JOIN race_drivers ON race_drivers.race_id = races.id").
   Where("races.id = ?", raceID).
   First(&race)

这将执行一个SQL INNER JOIN,它从race_drivers表中检索数据,并根据race_drivers中的race_id列将其与races表中的数据“联接”。然后,您可以通过race.Drivers切片上的RaceDriver结构字段访问RaceDriver联接表中的额外数据。
下面是一个如何从RaceDriver结构体访问PositionLaps字段的示例:

for _, driver := range race.Drivers {     
    position := driver.RaceDriver.Position     
    laps := driver.RaceDriver.Laps      
    // Do something with the position and laps values... 
}

希望这能有所帮助!如果你有其他问题,请告诉我。

相关问题