首页 > 其他分享 >gorm中的关联操作详解

gorm中的关联操作详解

时间:2022-10-09 19:23:37浏览次数:71  
标签:Name int db Dog 关联 详解 Girl Id 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 []Doggorm:"many2many:girl_dog"} type Dog struct { Id int Name string Girl []Girlgorm:"many2many:girl_dog" Info Info }

查询
1.只想查舔狗的女神有哪些,不要舔狗信息
image
2.舔狗信息也要,就加上预加载
image
想加条件和一对多差不多

关系维护
还是那几个函数
image

删除最好用事务

最后
image

注意多对多情况的FK和refer和一对一/多正好相反了

博客是观看b站up主(go圈里最会写js的奇淼)笔记
链接:https://www.bilibili.com/video/BV1E64y1472a?p=10&spm_id_from=pageDriver&vd_source=7de631e1910751f66cb6a72edf044dab

标签:Name,int,db,Dog,关联,详解,Girl,Id,gorm
From: https://www.cnblogs.com/nnsy/p/16773342.html

相关文章

  • ls 命令详解
    ls-lrt-lrt实际上是代表了"-l-r-t"这三个选项集合。 1)-l表示开启长列表输出,打开了就会输出文件权限、引用计数、所有者、所属组、文件大小、修改日期和文件名称......
  • PVE虚拟机安装详解
    前言PVE,全称ProxmoxVirtualEnvironment,是基于Debian的Linux系统,虚拟机内核为KVM。硬件兼容性优秀。界面功能不强,很多操作要靠命令行,但扩展能力几乎是无限的。前期准备......
  • 详解线性分类-逻辑回归(Logistic Regression)【白板推导系列笔记】
    一点最大后验估计的理解,不知道该写哪,就放这里了最大后验估计是根据经验数据获得对难以观察的量的点估计。与最大似然估计类似,但是最大的不同是,最大后验估计的融入了要估计......
  • 详解vue-element-admin之模块化Vuex
    最近项目要储备vue-element-admin,于是吧官方的demo拿来研究了一段时间~在这段期间内完成了一个自制的小项目,近期会上线(vue-element-admin后台+uniapp制作的小程序),请期待~......
  • Java虚拟机详解(五)------JVM参数
    JVM参数有很多,其实我们直接使用默认的JVM参数,不去修改都可以满足大多数情况。但是如果你想在有限的硬件资源下,部署的系统达到最大的运行效率,那么进行相关的JVM参数设置是必......
  • maven篇4:pom文件详解
    1、pom.xml文件详解<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://m......
  • Go中select条件语句详解
    一select语句select语句类似于switch语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。select是Go中的一个控制结构,类似......
  • Dev之GridControl 属性详解
    Dev之GridControl详解</div><divid="cnblogs_post_body"class="blogpost-bodyblogpost-body-html">Dev控件中的表格控件GridControl控件非常强大。不过,一些细枝......
  • JDK 1.8 HashMap 扩容源码详解
     作为开发人员,千万不能停留在实现功能上,一定要提升到性能方面上。这需要我们不断的实践,学习源码, 根据底层实现原理,来做出最好的操作。 就HashMap而言,一定是我们常用的......
  • Linux_Bash_Shell_索引数组和关联数组及稀疏数组
     1. 索引数组 一、什么是索引数组?所谓索引数组就是普通数组,以整数作为数组元素的索引下标。   二、实例。  备注:(a)使用-a选项定义索引数组,使用一对......