当前位置: 首页 > news >正文

【Gorm】如何在 GORM 中实现模型之间的关联?

文章目录

  • 关联
    • 1、Belongs To(属于)
    • 2、Has One(拥有一个)
    • 3、Has Many(拥有多个)
    • 4、Many To Many(多对多)

关联

​ 当涉及到 ORM(Object-Relational Mapping)的时候,关联是一项非常重要的功能。在 GORM 中,有许多类型的关联,每种关联都具有不同的特点和用法。

下面是 GORM 中主要的关联类型和相关的定义和用法:

1、Belongs To(属于)

​ ​ ​ ​ ​ ​ ​ ​ 属于关系表示一个模型属于另一个模型,通常用于建立父子模型之间的关系。例如,订单属于用户,评论属于文章。

在 GORM 中,属于关系需要在模型中使用 BelongsTo 方法进行定义。在数据库中,属于关系通常是通过在子模型中添加一个外键来实现的。

示例:

goCopy code
type Order struct {ID        uintUserID    uintUser      UserOrderName string
}type User struct {ID   uintName string
}// 声明 Order 属于 User
db.Model(&Order{}).BelongsTo(&User{})

2、Has One(拥有一个)

​​ ​ ​ ​ ​ ​ ​ ​ 拥有一个关系表示一个模型拥有一个相关联的模型,通常用于建立一对一的关系。例如,用户拥有一个个人资料,文章拥有一个作者。

在 GORM 中,拥有一个关系需要在模型中使用 HasOne 方法进行定义。在数据库中,拥有一个关系通常是通过在拥有者模型中添加一个外键来实现的。

示例:

goCopy code
type User struct {ID       uintName     stringProfile  Profile
}type Profile struct {ID     uintUserID uintTitle  string
}// 声明 User 拥有一个 Profile
db.Model(&User{}).HasOne(&Profile{})

3、Has Many(拥有多个)

​​ ​ ​ ​ ​ ​ ​ ​ 拥有多个关系表示一个模型拥有多个相关联的模型,通常用于建立一对多的关系。例如,一个用户拥有多个订单,一个文章拥有多个评论。

在 GORM 中,拥有多个关系需要在模型中使用 HasMany 方法进行定义。在数据库中,拥有多个关系通常是通过在拥有者模型中添加一个外键来实现的。

示例:

goCopy code
type User struct {ID     uintName   stringOrders []Order
}type Order struct {ID        uintUserID    uintOrderName string
}// 声明 User 拥有多个 Order
db.Model(&User{}).HasMany(&Order{})

4、Many To Many(多对多)

​​ ​ ​ ​ ​ ​ ​ ​ 多对多关系表示两个模型之间存在多对多的关系,通常用于建立多对多的关系。例如,一个学生可以选择多个课程,一个课程可以有多个学生。

在 GORM 中,多对多关系需要通过一个中间模型来实现。中间模型包含两个外键,分别关联两个相关联的模型。在 GORM 中,使用 Many2Many 方法来定义多对多关系。

示例:

goCopy code
goCopy code
type Course struct {ID        uintName      stringStudents  []Student `gorm:"many2many:course_students"`
}type Student struct {ID       uintName     stringCourses  []Course `gorm:"many2many:course_students"`
}type CourseStudent struct {CourseID  uintStudentID uint
}// 声明 Course 和 Student 之间的多对多关系
db.Model(&Course{}).Association("Students").Append(&student1, &student2)
db.Model(&Student{}).Association("Courses").Append(&course1, &course2)
http://www.lryc.cn/news/66041.html

相关文章:

  • Linux危险命令
  • FPGA入门系列13--异步串口通信
  • k8s基础4——deployment控制器、应用部署、升级、回滚、水平扩容缩容
  • 动态规划算法——40道leetcode实例入门到熟练
  • Nmap入门到高级【第十一章】
  • 配置本地Angular环境并使用VsCode调试Angular前端项目
  • 100ASK_全志V853-PRO开发板支持人形检测和人脸识别
  • 简单实现基于UDP与TCP的回显服务器
  • 家用洗地机有什么推荐的吗?家用洗地机哪款好
  • 深度学习与文本聚类:一篇全面的介绍与实践指南
  • AP5153 线性降压恒流驱动芯片 2.5A
  • Unity物理系统脚本编程(下)
  • 容器技术的发展
  • Python Flask request中常见存储参数的介绍
  • php+vue网盘系统的设计与实现
  • [前端]深浅拷贝
  • 文章纠错免费软件-文字校对软件免费下载
  • 【Redis】Redis缓存雪崩、缓存穿透、缓存击穿(热key问题)
  • 为什么很多程序员喜欢linux系统?
  • Bean 作用域和生命周期
  • PMP考试常见13个固定套路
  • Leecode101 ——对称二叉树
  • JVM学习随笔03——Java堆中new一个对象的步骤
  • 虹科方案 | CEMEX 使用HK-Edgility 智能边缘计算平台简化其企业 WAN 管理和运营
  • rk3568 系统移植和编译
  • 深度解析C++异常处理机制:分类、处理方式、常见错误及11新增功能
  • FPGA时序约束(四)主时钟、虚拟时钟和时钟特性的约束
  • JNI开发
  • JAVA有哪些特点?
  • 使用读写锁提高并发