gorm 教程二(1)

简介: gorm 教程二

关联

Belongs To

属于

belongs to 关联建立一个和另一个模型的一对一连接,使得模型声明每个实例都「属于」另一个模型的一个实例 。

例如,如果你的应用包含了用户和用户资料, 并且每一个用户资料只分配给一个用户

type User struct {
  gorm.Model
  Name string
}
// `Profile` 属于 `User`, `UserID` 是外键
type Profile struct {
  gorm.Model
  UserID int
  User   User
  Name   string
}

外键

为了定义从属关系, 外键是必须存在的, 默认的外键使用所有者类型名称加上其主键。

像上面的例子,为了声明一个模型属于 User,它的外键应该为 UserID。

GORM 提供了一个定制外键的方法,例如:

type User struct {
    gorm.Model
    Name string
}
type Profile struct {
    gorm.Model
  Name      string
  User      User `gorm:"foreignkey:UserRefer"` // 使用 UserRefer 作为外键
  UserRefer string
}

关联外键

对于从属关系, GORM 通常使用所有者的主键作为外键值,在上面的例子中,就是 User 的 ID。

当你分配一个资料给一个用户, GORM 将保存用户表的 ID 值 到 用户资料表的 UserID 字段里。

你可以通过改变标签 association_foreignkey 来改变它, 例如:

type User struct {
    gorm.Model
  Refer int
    Name string
}
type Profile struct {
    gorm.Model
  Name      string
  User      User `gorm:"association_foreignkey:Refer"` // use Refer 作为关联外键
  UserRefer string
}

使用属于

你能找到 belongs to 和 Related 的关联

db.Model(&user).Related(&profile)
 SELECT * FROM profiles WHERE user_id = 111; // 111 is user's ID

Has One

has one 关联也是与另一个模型建立一对一的连接,但语义(和结果)有些不同。 此关联表示模型的每个实例包含或拥有另一个模型的一个实例。

例如,如果你的应用程序包含用户和信用卡,并且每个用户只能有一张信用卡。

// 用户有一个信用卡,CredtCardID 外键
type User struct {
    gorm.Model
    CreditCard   CreditCard
}
type CreditCard struct {
    gorm.Model
    Number   string
    UserID    uint
}

外键

对于一对一关系,一个外键字段也必须存在,所有者将保存主键到模型关联的字段里。

这个字段的名字通常由 belongs to model 的类型加上它的 primary key 产生的,就上面的例子而言,它就是 CreditCardID

当你给用户一个信用卡, 它将保存一个信用卡的 ID 到 CreditCardID 字段中。

如果你想使用另一个字段来保存这个关系,你可以通过使用标签 foreignkey 来改变它, 例如:

type User struct {
  gorm.Model
  CreditCard CreditCard `gorm:"foreignkey:CardRefer"`
}
type CreditCard struct {
    gorm.Model
    Number      string
    UserName string
}

关联外键

通常,所有者会保存 belogns to model 的主键到外键,你可以改为保存其他字段, 就像下面的例子使用 Number 。

type User struct {
  gorm.Model
  CreditCard CreditCard `gorm:"association_foreignkey:Number"`
}
type CreditCard struct {
    gorm.Model
    Number string
    UID       string
}

多态关联

支持多态的一对多和一对一关联。

type Cat struct {
    ID    int
    Name  string
    Toy   Toy `gorm:"polymorphic:Owner;"`
  }
  type Dog struct {
    ID   int
    Name string
    Toy  Toy `gorm:"polymorphic:Owner;"`
  }
  type Toy struct {
    ID        int
    Name      string
    OwnerID   int
    OwnerType string
  }

注意:多态属于和多对多是明确的不支持并将会抛出错误。

使用一对一

你可以通过 Related 找到 has one 关联。

var card CreditCard
db.Model(&user).Related(&card, "CreditCard")
 SELECT * FROM credit_cards WHERE user_id = 123; // 123 是用户表的主键
// CreditCard  是用户表的字段名,这意味着获取用户的信用卡关系并写入变量 card。
// 像上面的例子,如果字段名和变量类型名一样,它就可以省略, 像:
db.Model(&user).Related(&card)

Has Many

一对多

has many 关联就是创建和另一个模型的一对多关系, 不像 has one,所有者可以拥有0个或多个模型实例。

例如,如果你的应用包含用户和信用卡, 并且每一个用户都拥有多张信用卡。

// 用户有多张信用卡,UserID 是外键
type User struct {
    gorm.Model
    CreditCards []CreditCard
}
type CreditCard struct {
    gorm.Model
    Number   string
    UserID  uint
}

外键

为了定义一对多关系, 外键是必须存在的,默认外键的名字是所有者类型的名字加上它的主键。

就像上面的例子,为了定义一个属于User 的模型,外键就应该为 UserID。

使用其他的字段名作为外键, 你可以通过 foreignkey 来定制它, 例如:

type User struct {
    gorm.Model
    CreditCards []CreditCard `gorm:"foreignkey:UserRefer"`
}
type CreditCard struct {
    gorm.Model
    Number    string
  UserRefer uint
}

外键关联

GORM 通常使用所有者的主键作为外键的值, 在上面的例子中,它就是 User 的 ID。

当你分配信用卡给一个用户, GORM 将保存用户 ID 到信用卡表的 UserID 字段中。

你能通过 association_foreignkey 来改变它, 例如:

type User struct {
    gorm.Model
  MemberNumber string
    CreditCards  []CreditCard `gorm:"foreignkey:UserMemberNumber;association_foreignkey:MemberNumber"`
}
type CreditCard struct {
    gorm.Model
    Number           string
  UserMemberNumber string
}

多态关联

支持多态的一对多和一对一关联。

type Cat struct {
    ID    int
    Name  string
    Toy   []Toy `gorm:"polymorphic:Owner;"`
  }
  type Dog struct {
    ID   int
    Name string
    Toy  []Toy `gorm:"polymorphic:Owner;"`
  }
  type Toy struct {
    ID        int
    Name      string
    OwnerID   int
    OwnerType string
  }

注意:多态属于和多对多是明确不支持并会抛出错误的。

使用一对多

你可以通过Related 找到 has many 关联关系。

db.Model(&user).Related(&emails)
 SELECT * FROM emails WHERE user_id = 111; // 111 是用户表的主键

Many To Many

多对多

多对多为两个模型增加了一个中间表。

例如,如果你的应用包含用户和语言, 一个用户会说多种语言,并且很多用户会说一种特定的语言。

// 用户拥有并属于多种语言, 使用  `user_languages` 作为中间表
type User struct {
    gorm.Model
    Languages         []Language `gorm:"many2many:user_languages;"`
}
type Language struct {
    gorm.Model
    Name string
}


gorm 教程二(2)https://developer.aliyun.com/article/1391740

相关文章
|
11月前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
398 2
|
网络协议 关系型数据库 MySQL
MySQL 设置白名单的详细步骤
要为MySQL设置白名单,需要执行以下步骤: 1. 登录到MySQL服务器的命令行或图形界面客户端。 2. 选择要设置白名单的数据库。可以使用以下命令进入MySQL命令行界面: ``` mysql -u <username> -p ``` 3. 创建一个包含需要允许访问的IP地址的表。你可以使用以下命令进行创建: ``` CREATE TABLE whitelist ( id INT NOT NULL AUTO_INCREMENT, ip_address VARCHAR(45) NOT NULL, PRIMARY KEY (
3391 1
|
Android开发
flutter中实现仿Android端的onResume和onPause方法
flutter中实现仿Android端的onResume和onPause方法
|
Linux 网络安全 数据安全/隐私保护
linux 本地终端 SSH 连接 gcp (Google Cloud Platform ) 配置教程
linux 本地终端 SSH 连接 gcp (Google Cloud Platform ) 配置教程
8786 0
|
5月前
|
SQL Go 数据库
Gorm使用教程:掌握高级查询的技巧。
以上就是我们今天的旅程中所会遇到的一些有趣的Gorm查询技巧。学习这些技巧像是学着驾驶一辆全新的巴士,只要你掌握了这些,你可以在数据库的海洋中自由驾驶,轻松地转向,畅游其中。祝你在Gorm的世界中探索愉快!
138 36
|
分布式计算 DataWorks 关系型数据库
MaxCompute 生态系统中的数据集成工具
【8月更文第31天】在大数据时代,数据集成对于构建高效的数据处理流水线至关重要。阿里云的 MaxCompute 是一个用于处理大规模数据集的服务平台,它提供了强大的计算能力和丰富的生态系统工具来帮助用户管理和处理数据。本文将详细介绍如何使用 DataWorks 这样的工具将 MaxCompute 整合到整个数据处理流程中,以便更有效地管理数据生命周期。
359 0
|
网络协议 Go
golang判断ip地址是ipv4还是ipv6
golang判断ip地址是ipv4还是ipv6
|
12月前
|
Java Kotlin
Kotlin学习教程(十)
Kotlin学习教程(十)
|
Go 数据库
Go语言之GORM框架(四)——预加载,关联标签与多态关联,自定义数据类型与事务(完结篇)
Go语言之GORM框架(四)——预加载,关联标签与多态关联,自定义数据类型与事务(完结篇)
230 0
|
存储 缓存 Linux
高并发内存池实战:用C++构建高性能服务器(上)
高并发内存池实战:用C++构建高性能服务器