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`))
相关推荐
背帆2 小时前
数据转储(go)
数据库·golang
Wenhao.2 小时前
Go-web开发之帖子功能
开发语言·前端·golang
恋喵大鲤鱼2 小时前
Golang 身份证号码校验
开发语言·后端·golang
Saggitarxm3 小时前
Golang - 实现文件管理服务器
服务器·开发语言·golang
liupenglove5 小时前
一个读写excel的简单程序(golang)
数据仓库·后端·golang·excel
小黑随笔14 小时前
【Golang玩转本地大模型实战(二):基于Golang + Web实现AI对话页面】
前端·人工智能·golang
城里有一颗星星18 小时前
基于go的简单管理系统(增删改查)
开发语言·后端·golang
言之。1 天前
Go语言中的错误处理
开发语言·后端·golang
席万里2 天前
vscode详细配置Go语言相关插件
ide·vscode·golang
robch2 天前
golang接口和具体实现之间的类型转换
开发语言·后端·golang