当前位置:网站首页>gorm 关联关系小结
gorm 关联关系小结
2022-07-07 21:53:00 【咳咳,您好请多指教!】
数据库设计
表1:
CREATE TABLE `blog_user` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
`created_at` datetime(3) DEFAULT NULL,
`updated_at` datetime(3) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_blog_user_created_at` (`created_at`),
KEY `idx_blog_user_updated_at` (`updated_at`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
--------------------------------------------------------------------------------------------------------------------
表2:
CREATE TABLE `blog_article` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
`user_id` bigint unsigned NOT NULL,
`is_hot` tinyint NOT NULL,
`created_at` datetime(3) DEFAULT NULL,
`updated_at` datetime(3) DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
1.Belongs To 属于
用户与文章的关系 文章表存在用户表的id 作为 外键 ,文章 属于 用户
1-1 User 的 Model 结构体
type User struct {
models.BaseModel
UserName string `gorm:"column:username;" json:"username"`
Password string `json:"-"`
models.CommonTimestampsField
}
1-2 Article 的 Model 结构体
type Article struct {
models.BaseModel
Title string `json:"title"`
IsHot int8 `json:"is_hot"`
UserId int64 `json:"user_id"` //外键
User users.User `json:"user" gorm:"ForeignKey:UserId"`//关联的对象
}
查询:
Joins 或 Preload 预加载
var results []Article
database.DB.Model(&Article{}).Joins("User").Find(&results).Error, results
2. hasOne 一对一
用户与文章的关系 文章表存在用户表的id 作为 外键 ,用户 与 文章 一对一 (假定 一个人只能有一片文章)
2-1 User 的 Model 结构体
type User struct {
models.BaseModel
UserName string `gorm:"column:username;" json:"username"`
Password string `json:"-"`
Article article.Article `gorm:"foreignKey:UserId"`//一对一关联
models.CommonTimestampsField
}
2-2 Article 的 Model 结构体
type Article struct {
models.BaseModel
Title string `json:"title"`
IsHot int8 `json:"is_hot"`
UserId int64 `json:"user_id"` //外键
}
查询:
Preload 预加载
var results []Article
database.DB.Model(&User{}).Preload("Article").Find(&results).Error, results
3.Has Many 一对多 用户与文章的关系 文章表存在用户表的id 作为 外键 ,用户 与 文章 一对多
3-1 User 的 Model 结构体
type User struct {
models.BaseModel
UserName string `gorm:"column:username;" json:"username"`
Password string `json:"-"`
Article []article.Article `gorm:"foreignKey:UserId"`
models.CommonTimestampsField
}
3-2 Article 的 Model 结构体
type Article struct {
models.BaseModel
Title string `json:"title"`
IsHot int8 `json:"is_hot"`
UserId int64 `json:"user_id"` //外键
}
查询:
Preload 预加载
var results []Article
database.DB.Model(&User{}).Preload("Article").Find(&results).Error, results
4.Many To Many
4-1.新增 是体表 language & blog_user_has_language
CREATE TABLE `blog_language` (
`id` int NOT NULL AUTO_INCREMENT,
`title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
------------------------------------------------------------------------------------
CREATE TABLE `blog_user_has_language` (
`user_id` int NOT NULL DEFAULT '0',
`language_id` int NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
4-2.结构体
type User struct {
models.BaseModel
UserName string `gorm:"column:username;" json:"username"`
Password string `json:"-"`
Languages []language.Language `gorm:"many2many:user_has_language;"`
models.CommonTimestampsField
}
4-3.查询:
Preload 预加载
var results []Article
database.DB.Model(&User{}).Preload("Languages").Find(&results).Error, results
边栏推荐
- postgres timestamp转人眼时间字符串或者毫秒值
- Mobile heterogeneous computing technology - GPU OpenCL programming (basic)
- 2022 届的应届生都找到工作了吗?做自媒体可以吗?
- Extract the file name under the folder under win
- 【7.4】25. Turn over the linked list in groups of K
- 【7.5】15. 三数之和
- Summary of common methods of object class (September 14, 2020)
- Benchmarking Detection Transfer Learning with Vision Transformers(2021-11)
- 通达信买基金安全吗?
- 【7.5】15. Sum of three numbers
猜你喜欢

家用电器行业渠道商协同系统解决方案:助力家电企业快速实现渠道互联网化

Mobile heterogeneous computing technology - GPU OpenCL programming (basic)

Get started with mongodb

建筑建材行业SRM供应商云协同管理平台解决方案,实现业务应用可扩展可配置

Ora-01741 and ora-01704

Pycharm essential plug-in, change the background (self use, continuous update) | CSDN creation punch in

平衡二叉樹【AVL樹】——插入、删除

B_ QuRT_ User_ Guide(37)

Lm12 rolling heikin Ashi double K-line filter

C cat and dog
随机推荐
SAP HR奖罚信息导出
Live server usage
FPGA basics catalog
包装行业智能供应链S2B2B商城解决方案:开辟电商消费新生态
Navicat connects Oracle
平衡二叉树【AVL树】——插入、删除
MySQL Index Optimization Practice I
Arbre binaire équilibré [Arbre AVL] - Insérer et supprimer
Given an array, such as [7864, 284, 347, 7732, 8498], now you need to splice the numbers in the array to return the "largest possible number."
Idea automatically generates serialVersionUID
Pycharm essential plug-in, change the background (self use, continuous update) | CSDN creation punch in
生鲜行业数字化采购管理系统:助力生鲜企业解决采购难题,全程线上化采购执行
webflux - webclient Connect reset by peer Error
What if once again forgets the login password of raspberry pie? And you don't have a monitor yet! Today, I would like to introduce a method
Home appliance industry channel business collaboration system solution: help home appliance enterprises quickly realize the Internet of channels
StringUtils工具类
SAP HR 家庭成员信息
ASP. Net core middleware request processing pipeline
Benchmarking Detection Transfer Learning with Vision Transformers(2021-11)
C method question 2