全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-21 7 分钟 ✍️ juanwangdev

GORM 一对多关系配置

GORM 支持一对多关系映射,本文介绍 hasMany 的核心用法。

什么是一对多关系

一对多关系指一个模型实例关联多个另一个模型实例,常用于主从表场景,如用户与订单。

hasMany 配置

Go
type User struct {
    gorm.Model
    Name   string
    Orders []Order `gorm:"foreignKey:UserID"` // 一对多
}

type Order struct {
    gorm.Model
    UserID   uint
    Amount   float64
    Status   string
}

// 关联查询
db.Preload("Orders").First(&user)

关联操作

创建关联数据

Go
// 一起创建
user := User{
    Name: "张三",
    Orders: []Order{
        {Amount: 100, Status: "pending"},
        {Amount: 200, Status: "completed"},
    },
}
db.Create(&user)

// 单独关联
order := Order{Amount: 300, Status: "pending"}
db.Create(&order)
user.Orders = append(user.Orders, order)
db.Save(&user)

条件预加载

Go
// 只预加载特定条件的关联
db.Preload("Orders", "status = ?", "completed").First(&user)

// 嵌套预加载
db.Preload("Orders.Items").First(&user)

关联统计

Go
// 统计关联记录数
db.Model(&user).Association("Orders").Count()

// 使用 Joins 查询
db.Joins("LEFT JOIN orders ON orders.user_id = users.id").
    Select("users.*, COUNT(orders.id) as order_count").
    Group("users.id").Find(&users)

hasMany 只在一侧配置,另一侧不需要标注关系。

注意事项

  • Preload 产生多条 SQL 查询,数据量大时应考虑 Joins 方式
  • 关联切片在创建时应初始化为空切片,避免 nil 问题
  • 删除主表记录前应处理所有从表记录(或使用外键级联)
  • 关联查询可加索引优化性能

要点总结

  • hasMany 实现一对多关系,外键在多方表中
  • 使用 Preload 加载关联数据,支持条件过滤
  • Joins 方式适合聚合查询和统计
  • 关联切片需正确初始化,删除注意级联处理

文章存放路径:D:\git2\jwdev\articles\GORM\进阶\关联关系管理\一对多关系配置.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 GORM 一对一关系配置
下一篇 → GORM 关联数据创建与更新
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库