一对一

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 []Doggorm:"many2many:girl_dog"} type Dog struct { Id int Name string Girl []Girlgorm:"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中的关联操作详解的更多相关文章

  1. android中的文件操作详解以及内部存储和外部存储(转载)

    原文链接:http://m.blog.csdn.net/article/details?id=17725989 摘要 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安 ...

  2. 【转】 android中的文件操作详解以及内部存储和外部存储

    摘要 其实安卓文件的操作和Java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者 ...

  3. MongoDB各种查询操作详解

    这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下   一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可 ...

  4. [Android新手区] SQLite 操作详解--SQL语法

    该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法  :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...

  5. iOS中MVC等设计模式详解

    iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ...

  6. 巨人大哥谈Web应用中的Session(session详解)

    巨人大哥谈Web应用中的Session(session详解) 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术. ...

  7. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  8. linux-2.6.26内核中ARM中断实现详解(转)

    转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...

  9. Django model 中的 class Meta 详解

    Django model 中的 class Meta 详解 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(mode ...

随机推荐

  1. 体验Lambda的更优写法和Lambda标准格式

    体验Lambda的更优写法 借助Java8的全新语法,上述Runnable接口的匿名内部类写法可以通过更简单的Lambda表达式达到等效: public class Lambda02 { public ...

  2. 剑指offer——day-1

    今天开始记录一下剑指offer的题目训练,提升一下自己的编程能力吧 题目一: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列 ...

  3. python代码如何写的优雅?

    简介 在实际项目中,我们可能一开始为了完成功能而忽视了代码的整体质量,因此,使用一些高阶的函数或方法,能够更加使我们的代码更加优雅.废话不多说,现在马上开始. 使用enumerate方法替代range ...

  4. 【Java面试】生产环境服务器变慢,如何诊断处理?

    "生产环境服务器变慢?如何诊断处理" 这是最近一些工作5年以上的粉丝反馈给我的问题,他们去一线大厂面试,都被问到了这一类的问题. 今天给大家分享一下,面试过程中遇到这个问题,我们应 ...

  5. 开源有魔力 - DolphinScheduler 的 Apache 之路

    关于 Apache DolphinScheduler社区 Apache DolphinScheduler(incubator) 于17年在易观数科立项,19年3月开源, 19 年8月进入Apache ...

  6. 【JAVA UI】HarmonyOS 如何使用TinyPinyin类库

    ​  参考资料 前言:TinyPinYin是一个适用于Java和Android.HarmonyOS的快速,低内存的汉字转拼音库.码云地址TinyPinYin,其使用方法已在API讲解中有详细介绍,本文 ...

  7. tomcat线程池

    tomcat线程池和普通的线程池设计上有所区别,下面主要来看看它是如何设计的 tomcat中线程池的创建 org.apache.tomcat.util.net.AbstractEndpoint#cre ...

  8. LuoguP3047 [USACO12FEB]附近的牛Nearby Cows(树形DP,容斥)

    \[f[u][step] = \begin{cases} C[u] & step = 0 \\ (\sum{f[v][step - 1]}) - f[u][step - 2] \cdot (d ...

  9. 一、JDK和JRE

    JDK和JRE JDK=JRE+开发工具包: JRE=JVM+核心类库 如果只是运行Java程序,安装JRE即可:开发Java程序并运行则需要安装JDK.目前最稳定版本是JDK8.0,并且马上部分企业 ...

  10. 手把手教你搭建JAVA分布式爬虫

    在工作中,我们经常需要去获取一些数据,但是这些数据可能需要从第三方平台才可以获取到.这个时候,爬虫系统就可以帮助我们来完成这些事情. 提到爬虫系统,很多人都会想到使用python.但实际上,语言只是一 ...