gorm中的关联操作详解
一对一
belong to
属于:可以理解为舔狗认为自己属于女神,而女神都不知道舔狗的存在
type Girl struct { Id int Name string } type Dog struct { Id int Name string GirlId int Girl Girl } 迁移 schema db.AutoMigrate(&Dog{}) //此时会将Girl和Dog都生成
hasone
拥有:可以理解为女神知道舔狗的存在,舔狗只需要留一根“狗链子”在女神创建的时候交给女神就好了
type Dog struct { Id int Name string GirlId int } type Girl struct { Id int Name string Dog Dog } //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 {
Id int
Name string
GirlId int
//Girl Girl
}
type Girl struct {
Id int
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)
还是预加载,需要如果条件判断
- 类似内联
`
// 带条件的预加载 Order
db.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.Where("state = ?", "active").Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users)
// SELECT * FROM users WHERE state = 'active';
// SELECT * FROM orders WHERE user_id IN (1,2) 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 { Id int money int GogId int } type Dog struct { Id int Name string GirlId int //Girl Girl Info 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
join
注意 Join适用于一对一的关系,例如: has one, belongs to
上面的问题可以:
db.Preload("Dogs", func(db *gorm.DB) *gorm.DB {
return db.Joins("Info").Where("money>200")
}).First(&girl)
多对多
创建格式:
type Info struct { Id int Money int DogId int } type Girl struct { Id int Name string Dogs []Dog
gorm:"many2many:girl_dog"} type Dog struct { Id int Name string Girl []Girl
gorm:"many2many:girl_dog" Info Info }
查询
1.只想查舔狗的女神有哪些,不要舔狗信息
2.舔狗信息也要,就加上预加载
想加条件和一对多差不多
关系维护
还是那几个函数
删除最好用事务
最后
注意多对多情况的FK和refer和一对一/多正好相反了
博客是观看b站up主(go圈里最会写js的奇淼)笔记
链接:https://www.bilibili.com/video/BV1E64y1472a?p=10&spm_id_from=pageDriver&vd_source=7de631e1910751f66cb6a72edf044dab
gorm中的关联操作详解的更多相关文章
- android中的文件操作详解以及内部存储和外部存储(转载)
原文链接:http://m.blog.csdn.net/article/details?id=17725989 摘要 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安 ...
- 【转】 android中的文件操作详解以及内部存储和外部存储
摘要 其实安卓文件的操作和Java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者 ...
- MongoDB各种查询操作详解
这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下 一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可 ...
- [Android新手区] SQLite 操作详解--SQL语法
该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法 :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...
- iOS中MVC等设计模式详解
iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ...
- 巨人大哥谈Web应用中的Session(session详解)
巨人大哥谈Web应用中的Session(session详解) 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术. ...
- Python中的高级数据结构详解
这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...
- linux-2.6.26内核中ARM中断实现详解(转)
转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...
- Django model 中的 class Meta 详解
Django model 中的 class Meta 详解 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(mode ...
随机推荐
- IDEA自定义liveTemplates(方法模板、类模板)
IDEA自定义liveTemplates(方法模板.类模板) 前言,搞这个模板有何意义? 降低大家写方法注释的成本,统一风格.有时候不是开发同学不爱写注释,而是没有合适的载体和空间. IDEA模板设置 ...
- 一文带你弄懂 CDN 技术的原理
对于 CDN 这个东西,相信大家都有耳闻,感觉既陌生但又熟悉.最近深入了解了一下 CDN,这才发现原来 CDN 如此重要!今天就跟大家科普一下 CDN 是什么,以及为啥要有 CDN,最后再讲一下 CD ...
- 一文带你了解webrtc基本原理(动手实现1v1视频通话)
webrtc (Web Real-Time Communications) 是一个实时通讯技术,也是实时音视频技术的标准和框架. 大白话讲,webrtc是一个集大成的实时音视频技术集,包含了各种客户端 ...
- 故障案例 | 主从复制环境中tokudb引擎报错排查过程
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 0 ...
- Linux 04 用户文件
参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 概述 完成用户管 ...
- java学习第五天异常机制.day14
异常处理机制 确保程序的正常执行.这种机制称为异常处理机制 异常对象 常用方法 方法介绍 toString 返回异常类型和异常信息 getMessage 返回异常信息 printStackTrace ...
- Servlet特性研究之异步模式
Servlet只有同步模型是怎样的? 异步处理是Servlet3.0版本的重要功能之一,分析异步处理模型之前,先看看同步处理的过程是怎样的: 客户端发起HTTP请求一个动态Servlet API,请求 ...
- JedisConnectionException: java.net.SocketException: Broken pipe (Write failed) 问题排查
问题描述 笔者有2个应用会不定时请求redis,其中一个应用大约每分钟请求一次,可以正常请求,但是另一个大约每小时请求一次的应用,经常出现Broken pipe (Write failed)报错,具体 ...
- 推荐软件(一):Motrix——磁力下载器
个人觉得迅雷这样的下载器广告又多,启动速度又慢,又占用内存和存储,非常地不好用.有时候下载速度也不是你自己网速的最大值,而且有一些资源也会因为版权问题阻止你下载. Motrix 界面非常简洁:下载速度 ...
- openstack中Glance组件简解
一.Glance组件介绍 1.概念 Glance是OpenStack镜像服务,用来注册.登陆和检索虚拟机镜像.Glance服务提供了一个REST API,使你能够查询虚拟机镜像元数据和检索的实际镜像. ...