我有一个自定义的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,但都不起作用,因为我试图获取对象数组。
我被困在这上面这么久真是疯了。任何提示都会很有帮助的!
1条答案
按热度按时间bq9c1y661#
听起来像是在尝试使用GORM的
Preload
方法从RaceDriver
连接表中快速加载额外的数据,但是Preload
只适用于从“多对一”或“多对多”关系的“多”端加载数据,而不适用于从连接表加载数据。要从联接表加载数据,需要使用不同的方法,例如
Joins
或Scopes
。以下是如何使用Joins
从RaceDriver
表加载数据的示例:复制代码
这将执行一个SQL
INNER JOIN
,它从race_drivers
表中检索数据,并根据race_drivers
中的race_id
列将其与races
表中的数据“联接”。然后,您可以通过race.Drivers
切片上的RaceDriver
结构字段访问RaceDriver
联接表中的额外数据。下面是一个如何从
RaceDriver
结构体访问Position
和Laps
字段的示例:希望这能有所帮助!如果你有其他问题,请告诉我。