一对一belong to属于:可以理解为舔狗认为自己属于女神,而女神都不知道舔狗的存在type Girl struct {IdintName string}type Dog struct {IdintNamestringGirlId intGirlGirl}迁移 schemadb.AutoMigrate(&Dog{})//此时会将Girl和Dog都生成
hasone拥有:可以理解为女神知道舔狗的存在,舔狗只需要留一根“狗链子”在女神创建的时候交给女神就好了type Dog struct {IdintNamestringGirlId int } type Girl struct {IdintName stringDogDog } //db.AutoMigrate(&Girl{})//只有一个Girl表生成 db.AutoMigrate(&Girl{}, &Dog{}) d := Dog{Id: 1,Name: "haha0"} db.Create(&Girl{Id: 1,Name: "nv0",Dog:d}) //此时Dog中的GirlId字段被自动填写
查询var girl Girl db.First(&girl, 1) fmt.Println(girl)
直接这样查是不行的,这是需要先预加载改成:db.Preload("Dog").First(&girl, 1)
关系操作//给舔狗创建关系db.Model(&Girl{Id:1}).Association("Dog").Append(&dog)上面是hasone的情况,belong to 的情况正好相反Append换为Delete,是删除连接换为Replace(&g1,&g2),是替换连接Clear(),自身去掉所有关系
一对多还是上面的例子只需要微微改动` type Dog struct {IdintNamestringGirlId int//GirlGirl}
type Girl struct { Idint Name string Dogs []Dog}d0 := Dog{Id: 1, Name: "haha0"}d1 := Dog{Id: 2, Name: "haha2"}g := &Girl{Id: 1, Name: "nv0", Dogs: []Dog{d0, d1},}db.Create(&g)db.AutoMigrate(&Girl{}, &Dog{})
`查询:db.Preload("Dogs").First(&girl)还是预加载,需要如果条件判断
- 类似内联`// 带条件的预加载 Orderdb.Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)// SELECT * FROM users;// SELECT * FROM orders WHERE user_id IN (1,2,3,4) AND state NOT IN ('cancelled');
`
- 自定义预加载
db.Preload("Orders", func(db *gorm.DB) *gorm.DB { return db.Order("orders.amount DESC") }).Find(&users) // SELECT * FROM users; // SELECT * FROM orders WHERE user_id IN (1,2,3,4) order by orders.amount DESC;
- 链式预加载修改结构体
type Info struct {Idintmoney intGogId int } type Dog struct {IdintNamestringGirlId int//GirlGirlInfo Info }
注意生成数据库表的时候,各个表生成的顺序,否则报错db.AutoMigrate(&Girl{}, &Dog{}, &Info{})在查询db.Preload("Dogs.Info").Preload("Dogs").First(&girl)同时加条件的话和上面也一样,但是需要注意查询条件只适用于她所在的预加载的那一层例如:db.Preload("Dogs.Info", "money>100").Preload("Dogs").First(&girl)输出结果小于100的info信息会没有,但是dog依然会查出来,money>100条件影响不到Preload("Dogs")那怎么样可以实现输出结果小于100的info信息会没有 , dog也没有呢,可以使用join
多对多创建格式:
type Info struct {IdintMoney intDogId int } type Girl struct {IdintName stringDogs []Dog
gorm:"many2many:girl_dog"} type Dog struct {IdintNamestringGirl[]Girl
gorm:"many2many:girl_dog" InfoInfo }
查询1.只想查舔狗的女神有哪些,不要舔狗信息
文章插图
2.舔狗信息也要,就加上预加载
文章插图
想加条件和一对多差不多
关系维护还是那几个函数
文章插图
删除最好用事务
最后
文章插图
注意多对多情况的FK和refer和一对一/多正好相反了
博客是观看b站up主(go圈里最会写js的奇淼)笔记链接:https://www.bilibili.com/video/BV1E64y1472a?p=10&spm_id_from=pageDriver&vd_source=7de631e1910751f66cb6a72edf044dab
【gorm中的关联操作详解】
推荐阅读
- Go中的闭包、递归
- Java核心技术阅读笔记 java中的自动拆装箱与缓存
- 说说传说中的KFC御用豆浆,为什么这么好喝
- 文盘Rust -- struct 中的生命周期
- .Net WebApi 中的 FromBody FromForm FromQuery FromHeader FromRoute
- oracle中的行转列,列转行
- 工作7年收集到的git命令
- C#/VB.NET 读取条码类型及条码在图片中的坐标位置
- 编码中的Adapter,不仅是一种设计模式,更是一种架构理念与解决方案
- JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践