Golang Gorm 一对多的添加

一对多的添加有两种情况:

  • 一种是添加用户的时候同时创建文章
  • 其次是创建文章关联已经存在的用户。
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
}

type Article struct {
	ID     int64  `gorm:"size:4"`
	Title  string `gorm:"size:16"`
	UserID int64  //属于  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{})

	var u User
	a1 := Article{
		Title: "redis",
	}

	u = User{
		Name: "yanzi",
		Articles: []Article{
			{
				Title: "golang",
			},
			{
				Title: "k8s",
			},
			a1,
		},
	}

	db.Debug().Create(&u)
}


[8.981ms] [rows:3] INSERT INTO `article` (`title`,`user_id`) VALUES ('golang',2),('k8s',2),('redis',2) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user
_id`)

[14.812ms] [rows:1] INSERT INTO `user` (`name`) VALUES ('yanzi')

最后一种就是关联已有用户

Go 复制代码
	var articles []Article
	articles = []Article{
		{
			Title:  "cherry",
			UserID: 2,
		},
		{
			Title:  "marry",
			UserID: 2,
		},
	}

	db.Debug().Create(&articles)

[11.754ms] [rows:2] INSERT INTO `article` (`title`,`user_id`) VALUES ('cherry',2),('marry',2)

外键添加


Go 复制代码
	var u User
	db.Debug().Take(&u, 3)

	var a Article
	db.Debug().Take(&a, 7)

	u.Articles = []Article{a}
	db.Debug().Save(&u)


[1.300ms] [rows:1] SELECT * FROM `user` WHERE `user`.`id` = 3 LIMIT 1

[1.629ms] [rows:1] SELECT * FROM `article` WHERE `article`.`id` = 7 LIMIT 1

[2.901ms] [rows:2] INSERT INTO `article` (`title`,`user_id`,`id`) VALUES ('marry',3,7) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)

[6.363ms] [rows:0] UPDATE `user` SET `name`='test' WHERE `id` = 3

[0.557ms] [rows:0] INSERT INTO `article` (`title`,`user_id`,`id`) VALUES ('marry',3,7) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)

[3.713ms] [rows:0] INSERT INTO `user` (`name`,`id`) VALUES ('test',3) ON DUPLICATE KEY UPDATE `name`=VALUES(`name`)



mysql> select * from user;
+----+-------+
| id | name  |
+----+-------+
|  1 | lucas |
|  2 | yanzi |
|  3 | test  |
+----+-------+
mysql> select * from article;
+----+--------+---------+
| id | title  | user_id |
+----+--------+---------+
|  1 | golang |       1 |
|  2 | k8s    |       1 |
|  3 | golang |       2 |
|  4 | k8s    |       2 |
|  5 | redis  |       2 |
|  6 | cherry |       2 |
|  7 | marry  |       3 |
+----+--------+---------+
Go 复制代码
	var u User
	db.Debug().Take(&u, 3)

	var a Article
	db.Debug().Take(&a, 6)

	db.Debug().Model(&u).Association("Articles").Append(&a)


[2.196ms] [rows:2] INSERT INTO `article` (`title`,`user_id`,`id`) VALUES ('cherry',3,6) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)

model是声明映射关系的对象类型,通过这个对象类型,找到表名和字段。

Go 复制代码
	var u User
	db.Debug().Take(&u, 3)

	var a Article
	db.Debug().Take(&a, 5)

	db.Debug().Model(&u).Association("Articles").Append(&a)


[1.409ms] [rows:1] SELECT * FROM `user` WHERE `user`.`id` = 3 LIMIT 1

[1.254ms] [rows:1] SELECT * FROM `article` WHERE `article`.`id` = 5 LIMIT 1

[2.285ms] [rows:2] INSERT INTO `article` (`title`,`user_id`,`id`) VALUES ('redis',3,5) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)
相关推荐
紧跟先前的步伐2 小时前
Go AI Agent 实战 22|完善 Agent 执行循环:从工具调用到最终回答
人工智能·ai·golang
后台模板学习4 小时前
Go Web开发中任务调度框架的源码解析与高可用实现方案
开发语言·后端·golang
FungLeo4 小时前
成为全栈·Go 后端篇·分类树与标签关系:目录变更为何需要协调
golang·go·gorm·数据库事务·分类树·成为全栈
fly-iot4 小时前
【FDE知识库】(1):AI 编程时代开发语言选型分析,云使用go,企业用java,算法python,底层c
开发语言·人工智能·golang
FungLeo4 小时前
成为全栈·Go 后端篇·文章查询与展示投影:安全分页、排序和软删除
golang·go·gorm·分页查询·成为全栈·sql安全
紧跟先前的步伐13 小时前
Go AI Agent 实战 24|工具系统工程化收尾与阶段验收
人工智能·ai·golang·1024程序员节
日日大王学编程15 小时前
#Feed 流项目复盘:Redis 时间线缓存与 Outbox 消息可靠性设计
golang·1024程序员节
北冥you鱼1 天前
Go 语言 CRUD 实战:从接口设计到真实业务场景
开发语言·后端·golang
利威尔xu1 天前
Go IM 源码实战(11):token 只是个 HASH,多端互踢的顺序错了就踢错人
后端·微服务·面试·架构·golang
microrain1 天前
SagooIoT 把协议解析和消息通知都放进了独立进程
物联网·golang·插件·sagooiot