上篇文中介绍了gorm的安装和基本使用,本章我们将探讨如何在 Go 语言的 GORM 库中使用各种类型的关联,包括 Belongs To、HasOne、Has Many 以及 Many To Many。我们还会介绍关联模式和预加载的概念,并通过实例代码来展示它们的具体用法。
belongs to 会与另一个模型建立了一对一的连接。 这种模型的每一个实例都“属于”另一个模型的一个实例。
介绍和案例代码 以下是一个“用户”和“资料”模型,用户拥有一个资料,表明资料属于用户:
package main
import (
"gorm.io/gorm"
)
// User 模型
type User struct {
gorm.Model
Name string
Profile Profile
}
// Profile 模型
type Profile struct {
gorm.Model
UserID uint // 外键
Bio string
}
// 声明属于关系
func (Profile) TableName() string {
return "profiles"
}
func main() {
db, _ := gorm.Open(/* ... */)
// 查询用户的资料
var user User
db.Model(&user).Association("Profile").Find(&user.Profile)
}
has one 与另一个模型建立一对一的关联,但它和一对一关系有些许不同。 这种关联表明一个模型的每个实例都包含或拥有另一个模型的一个实例。
例如,您的应用包含 user 和 credit card 模型,且每个 user 只能有一张 credit card。
介绍和案例代码 在这个例子中,我们定义了 CreditCard 模型,每个用户有一张信用卡:
// User 模型
type User struct {
gorm.Model
Name string
CreditCard CreditCard
}
// CreditCard 模型
type CreditCard struct {
gorm.Model
Number string
UserID uint // 外键
}
func main() {
db, _ := gorm.Open(/* ... */)
// 查询用户的信用卡信息
var user User
db.Preload("CreditCard").Find(&user)
}
“Has Many”关系表示一个模型拥有另一个模型的多个实例。
// User 模型
type User struct {
gorm.Model
Name string
Orders []Order
}
// Order 模型
type Order struct {
gorm.Model
UserID uint // 外键
Price float64
}
func main() {
db, _ := gorm.Open(/* ... */)
// 查询用户的所有订单
var user User
db.Preload("Orders").Find(&user)
}
“Many To Many”关系表示两个模型通过一个连接表相互关联,每个模型可以与多个实例关联。
// User 模型
type User struct {
gorm.Model
Name string
Roles []Role `gorm:"many2many:user_roles;"`
}
// Role 模型
type Role struct {
gorm.Model
Name string
}
// UserRoles 连接表的映射模型
type UserRoles struct {
UserID uint
RoleID uint
}
func main() {
db, _ := gorm.Open(/* ... */)
// 查询用户的所有角色
var user User
db.Preload("Roles").Find(&user)
}
关联模式主要是用来处理已经存在的关联记录,例如追加关联、替换现有关联或者删除关联。
func main() {
db, _ := gorm.Open(/* ... */)
// 假设 user 和 role 是已经检索出的模型实例
var user User
var role Role
db.Model(&user).Association("Roles").Append(&role)
}
预加载是一种 Eager Loading 方法,允许你在载入父级模型时同时载入关联的模型。
// OrderItem 模型
type OrderItem struct {
gorm.Model
OrderID uint
ItemName string
Quantity int
}
// Order 模型加入 OrderItem 关联
type Order struct {
gorm.Model
UserID uint // 外键
Price float64
OrderItems []OrderItem
}
func main() {
db, _ := gorm.Open(/* ... */)
// 预加载用户的所有订单和订单项
var user User
db.Preload("Orders.OrderItems").Find(&user)
}
如果您喜欢我的文章,请点击下面按钮随意打赏,您的支持是我最大的动力。
最新评论