插件窝 干货文章 Golang Gorm框架:如何高效实现三表关联查询并获取User.UserName?

Golang Gorm框架:如何高效实现三表关联查询并获取User.UserName?

Order User Product 字段 367    来源:    2025-03-13

在Golang中使用Gorm框架进行三表关联查询并获取User.UserName,可以通过以下步骤实现。假设我们有三个表:UserOrderProduct,并且它们之间的关系如下:

  • User 表有一个 ID 字段作为主键。
  • Order 表有一个 UserID 字段作为外键,关联到 User 表的 ID 字段。
  • Order 表还有一个 ProductID 字段作为外键,关联到 Product 表的 ID 字段。

1. 定义模型

首先,我们需要定义这三个表的模型:

type User struct {
    ID       uint   `gorm:"primaryKey"`
    UserName string
    Orders   []Order
}

type Order struct {
    ID        uint `gorm:"primaryKey"`
    UserID    uint
    ProductID uint
    User      User    `gorm:"foreignKey:UserID"`
    Product   Product `gorm:"foreignKey:ProductID"`
}

type Product struct {
    ID    uint `gorm:"primaryKey"`
    Name  string
    Price float64
}

2. 进行三表关联查询

假设我们想要查询某个订单的详细信息,并获取该订单对应的用户名称 (User.UserName),可以使用以下代码:

var order Order
db.Preload("User").Preload("Product").First(&order, 1) // 假设我们要查询ID为1的订单

fmt.Println("Order ID:", order.ID)
fmt.Println("User Name:", order.User.UserName)
fmt.Println("Product Name:", order.Product.Name)

3. 解释

  • Preload("User"):预加载 User 表的数据,这样在查询 Order 时,Gorm会自动关联并加载对应的 User 数据。
  • Preload("Product"):预加载 Product 表的数据,这样在查询 Order 时,Gorm会自动关联并加载对应的 Product 数据。
  • First(&order, 1):查询ID为1的订单。

4. 获取User.UserName

通过 order.User.UserName 可以直接访问到该订单对应的用户名称。

5. 优化查询

如果你只想获取 User.UserName 而不需要其他字段,可以使用 Select 来指定需要查询的字段,以减少查询的数据量:

var order Order
db.Preload("User", "user_name").Preload("Product", "name").Select("orders.id, users.user_name, products.name").Joins("JOIN users ON orders.user_id = users.id").Joins("JOIN products ON orders.product_id = products.id").First(&order, 1)

fmt.Println("Order ID:", order.ID)
fmt.Println("User Name:", order.User.UserName)
fmt.Println("Product Name:", order.Product.Name)

6. 总结

通过使用Gorm的 PreloadJoins 方法,可以高效地实现三表关联查询,并获取所需的字段。这种方法不仅代码简洁,而且性能较好,适合在大多数场景下使用。