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

GORM 一对一关系配置

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

什么是一对一关系

一对一关系指一个模型实例只关联另一个模型的一个实例,常用于主子表场景,如用户与用户档案。

关系定义

关系说明外键位置
hasOne拥有关系,外键在对方表中对方表
belongsTo属于关系,外键在当前表中当前表

hasOne 配置

Go
type User struct {
    gorm.Model
    Name      string
    CreditCard CreditCard `gorm:"foreignKey:UserID"` // 一对一
}

type CreditCard struct {
    gorm.Model
    Number string
    UserID uint // 外键
}

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

belongsTo 配置

Go
type User struct {
    gorm.Model
    Name    string
    CompanyID uint
    Company Company `gorm:"foreignKey:CompanyID"` // 属于关系
}

type Company struct {
    gorm.Model
    Name string
}

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

关联操作

创建关联数据

Go
// 方式1:一起创建
user := User{
    Name: "张三",
    CreditCard: CreditCard{Number: "123456"},
}
db.Create(&user)

// 方式2:单独关联
card := CreditCard{Number: "789012"}
db.Create(&card)
user.CreditCard = card
db.Save(&user)

关联查询条件

Go
// 根据关联字段查询
db.Joins("JOIN credit_cards ON credit_cards.user_id = users.id").
    Where("credit_cards.number = ?", "123456").
    First(&user)

hasOnebelongsTo 是同一关系的双向视角,选择取决于你从哪个模型出发。

注意事项

  • foreignKey 指定外键字段名,默认是关联模型名 + ID
  • Preload 使用 JOIN 预加载,避免 N+1 查询问题
  • 外键字段应加索引提升查询性能
  • 删除主表记录前应处理关联的从表记录

要点总结

  • hasOne 外键在对方表,belongsTo 外键在当前表
  • 使用 Preload 预加载关联数据
  • 关系是双向的,根据查询方向选择标注方式
  • 外键字段建议加索引优化查询

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

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

← 上一篇 表结构检查
下一篇 → GORM 一对多关系配置
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

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

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