一对多的添加有两种情况:
- 一种是添加用户的时候同时创建文章
- 其次是创建文章关联已经存在的用户
添加用户的时候同时创建文章
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
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{})
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')
创建文章关联已经存在的用户
最后一种就是关联已有用户
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)
创建用户文章并且关联
db.Debug().Create(&Article{
Title: "c",
User: User{
Name: "yanzi",
},
})
var u User
db.Debug().Take(&u, 2)
db.Create(&Article{
Title: "php",
User: u,
})
- model是声明映射关系的对象类型,通过这个对象类型,找到表名和字段。
- Association 是关联某个一对多的字段
- find是查找一对多关系 append是更新或者新增一对多关系
Association 关联的是字段,为字符串。后面的find和append是具体的结构体指针变量!!!
db.Model(&user).Association(“CreditCard”).Find(&user.CreditCard)
db.Debug().Model(&u).Association(“Articles”).Append(&a)
外键添加 现有文章关联已有用户
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 |
+----+--------+---------+
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是声明映射关系的对象类型,通过这个对象类型,找到表名和字段。
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`)
外键添加 现有用户关联文章
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: Three.js 进阶之旅:滚动控制模型动画和相机动画 🦢hello
声明:本文涉及图文和模型素材仅用于个人学习、研究和欣赏,请勿二次修改、非法传播、转载、出版、商用、及进行其他获利行为。 摘要 专栏上篇文章《Three.js 进阶之旅:页面平滑滚动-王国之泪》 讲解并实现了如何使用 R3F 进行页面图片平滑滚动,本文内容在上节…