Golang Gorm 一对多关系 表结构的建立

Belongs To


belongs to 会与另一个模型建立了一对一的连接。 这种模型的每一个实例都"属于"另一个模型的一个实例。

例如,应用包含 user 和 company,并且每个 user 能且只能被分配给一个 company。

下面的类型就表示这种关系。 注意,在 User 对象中,有一个和 Company 一样的 CompanyID。 默认情况下, CompanyID 被隐含地用来在 User 和 Company 之间创建一个外键关系, 因此必须包含在 User 结构体中才能填充 Company 内部结构体。

Go 复制代码
// `User` 属于 `Company`,`CompanyID` 是外键
type User struct {
  gorm.Model
  Name      string
  CompanyID int
  Company   Company
}

type Company struct {
  ID   int
  Name string
}

Has Many


has many 与另一个模型建立了一对多的连接。 不同于 has one,拥有者可以有零或多个关联模型。

例如,应用包含 user 和 credit card 模型,且每个 user 可以有多张 credit card。

声明

Go 复制代码
// User 有多张 CreditCard,UserID 是外键
type User struct {
  gorm.Model
  CreditCards []CreditCard
}

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

检索

Go 复制代码
// 检索用户列表并预加载信用卡
func GetAll(db *gorm.DB) ([]User, error) {
    var users []User
    err := db.Model(&User{}).Preload("CreditCards").Find(&users).Error
    return users, err
}

一对多关系


我们先从一对多开始多表关系的学习因为一对多的关系生活中到处都是,例如:

  • 用户与文章

在创建的时候先将没有依赖的创建。表名称+ID就是外键。外键要和关联的外键的数据类型要保持一致。

Articles Article 这里必须是表名的复数。

Go 复制代码
package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// User 用户表 一个用户拥有多篇文章
type User struct {
	ID       int64
	Name     string    `gorm:"size:6"`
	Articles []Article //用户拥有的文章列表 has many
}

// Article 文章表 一篇文章属于一个用户
type Article struct {
	ID     int64  `gorm:"size:4"`
	Title  string `gorm:"size:16"`
	UserID int64  //属于  belongs to
	User   User   //属于  belongs to
}

func (*User) TableName() string {
	return "user"
}

func (*Article) TableName() string {
	return "article"
}

func main() {
	dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	db.Debug().AutoMigrate(&User{}, &Article{})
}

[40.909ms] [rows:0] CREATE TABLE `user` (`id` bigint AUTO_INCREMENT,`name` varchar(6),PRIMARY KEY (`id`))

[26.904ms] [rows:0] CREATE TABLE `article` (`id` tinyint AUTO_INCREMENT,`title` varchar(16),`user_id` bigint,PRIMARY KEY (`id`),CONSTRAINT `fk_user
_articles` FOREIGN KEY (`user_id`) REFERENCES `user`(`id`))
相关推荐
我不会起名字3224 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
A心有千千结8 小时前
GO 使用 OpenTelemetry 进行编译时插桩,实现零码注入
数据库·golang·可观测性·观测云
金金计较.1 天前
Go语言-3
java·开发语言·golang
名字还没想好☜1 天前
Go 用 json.Decoder 流式解析大 JSON:边读边处理不爆内存
开发语言·后端·golang·go·json
皓月盈江2 天前
Linux系统使用VSCode搭建GO开发环境
linux·vscode·ubuntu·golang·debian
小羊在睡觉2 天前
HLS视频
linux·后端·golang
金金计较.3 天前
Go语言-2
开发语言·算法·golang