能否使用GORM的Preload加载指定用户的全部有效关联商品?
如何用GORM加载用户已使用的关联商品
首先先修正你提供的Go结构体的语法问题(原代码存在语法错误,比如type struct写法错误、标签使用单引号、User的Name类型应为string):
type Product struct { Id int Name string } type Order struct { Id int Name string Status int // 0-未使用 1-已使用 UserId int `gorm:"foreignKey:UserId"` ProductId int `gorm:"foreignKey:ProductId;references:Id"` } type User struct { Id int Name string }
针对你的问题:可以实现加载某用户状态为1的关联商品,但不能直接通过Product与User的Preload完成,因为两者没有直接外键关联,需要借助中间表Order来建立关联关系,下面提供两种可行的实现方式:
方式一:使用Joins直接查询商品列表
这种方式直接通过多表关联查询,一步获取目标商品:
// 查询ID为1的用户的已使用商品 var products []Product err := db.Model(&User{}). Joins("JOIN orders ON orders.user_id = users.id AND orders.status = 1"). Joins("JOIN products ON products.id = orders.product_id"). Where("users.id = ?", 1). Find(&products).Error if err != nil { // 处理查询错误 }
方式二:嵌套Preload关联查询
先给结构体添加关联字段,通过嵌套Preload先加载用户的有效订单,再从订单中提取商品:
首先更新结构体,添加关联关系:
type User struct { Id int Name string Orders []Order `gorm:"foreignKey:UserId"` // 用户关联订单 } type Order struct { Id int Name string Status int // 0-未使用 1-已使用 UserId int `gorm:"foreignKey:UserId"` ProductId int `gorm:"foreignKey:ProductId;references:Id"` Product Product `gorm:"foreignKey:ProductId"` // 订单关联商品 }
然后执行查询并提取商品:
var user User err := db.Preload("Orders", "status = ?", 1). // 只加载状态为1的订单 Preload("Orders.Product"). // 加载订单对应的商品 First(&user, 1).Error // 查询ID为1的用户 if err != nil { // 处理查询错误 } // 从用户的有效订单中提取商品列表 var products []Product for _, order := range user.Orders { products = append(products, order.Product) }
总结来说,虽然Product和User没有直接外键,但通过中间表Order的关联,结合GORM的Joins或嵌套Preload能力,就能轻松获取到指定用户的已使用商品。
内容的提问来源于stack exchange,提问作者Mam
相关产品推荐
相关产品推荐

