GORM(二)入门之关联

Golang Gorm 关联使用指南

上篇文中介绍了gorm的安装和基本使用,本章我们将探讨如何在 Go 语言的 GORM 库中使用各种类型的关联,包括 Belongs To、HasOne、Has Many 以及 Many To Many。我们还会介绍关联模式和预加载的概念,并通过实例代码来展示它们的具体用法。

1. Belongs To

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)
}

2. Has One

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)
}

3. Has Many

“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)
}

4. Many To Many

“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)
}

5. 关联模式

关联模式主要是用来处理已经存在的关联记录,例如追加关联、替换现有关联或者删除关联。

func main() {
    db, _ := gorm.Open(/* ... */)

    // 假设 user 和 role 是已经检索出的模型实例
    var user User
    var role Role
    db.Model(&user).Association("Roles").Append(&role)
}

6. 预加载

预加载是一种 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)
}

打 赏