gORM belongs to关联无法预加载,TableID为空关联对象全为零值
问题原因
1. 外键类型不匹配
gorm.Model内置的ID字段默认是uint类型,你定义的Booking结构体中TableID为*int类型,外键和关联表主键类型不一致,gorm无法自动识别关联关系。
2. 关联创建代码逻辑错误
你调用db.Model(&tables[0]).Association("Table").Append(&booking)建立关联时存在两个错误:
- Table结构体中没有名为
Table的关联字段,gorm找不到对应关联进行操作 - 你要建立的是Table一对多Booking,Booking属于Table的关系,需要先在Table结构体中定义反向关联字段,再指定正确的关联名操作
修复方案
第一步:调整结构体定义
type Table struct { gorm.Model Number int Price int // 可选新增:如果需要从Table侧查询关联的Booking,加反向关联字段 Bookings []Booking } type Booking struct { gorm.Model // 把TableID类型从*int改为*uint,和Table的ID类型对齐 TableID *uint Table Table OwnerID uint Time int OwnerType string }
第二步:修改关联创建逻辑
如果不需要从Table侧查询关联Booking,最简单的写法是直接给Booking的Table字段赋值:
func createStuff() { db := DatabaseConnection() tables := []Table{ {Number: 1, Price: 100}, {Number: 2, Price: 100}, // 其余Table定义保持不变 } user := User{ Username: "martin", Password: "secret", } db.Create(&user) db.Create(&tables) // 创建Booking时直接绑定关联的Table,gorm会自动填充TableID booking := Booking{Time: 1234, Table: tables[0]} db.Create(&booking) db.Model(&user).Association("Bookings").Append(&booking) }
如果你要走Association操作,就把原有错误的关联代码替换为:
db.Model(&tables[0]).Association("Bookings").Append(&booking)
可选优化:调整预加载顺序
查询嵌套关联时建议先加载外层关联,再加载内层关联:
func checkUser() { db := DatabaseConnection() var user User db.Preload("Bookings").Preload("Bookings.Table").First(&user) u, _ := json.Marshal(&user) fmt.Println(string(u)) }
修复后再次运行,Booking的TableID会正确填充,Preload也能正常返回关联的Table对象。
内容的提问来源于stack exchange,提问作者mama
相关产品推荐
相关产品推荐

