Golang Gorm 一对多 关联模式 Association + Find 查询关联

2023-09-21 19:28:35

查找关联


// User 拥有并属于多种 language,`user_languages` 是连接表
type User struct {
  gorm.Model
  Languages []Language `gorm:"many2many:user_languages;"`
}

type Language struct {
  gorm.Model
  Name string
}

查找所有匹配的关联记录

db.Model(&user).Association("Languages").Find(&languages)

查找带条件的关联

codes := []string{"zh-CN", "en-US", "ja-JP"}
db.Model(&user).Where("code IN ?", codes).Association("Languages").Find(&languages)

db.Model(&user).Where("code IN ?", codes).Order("code desc").Association("Languages").Find(&languages)

------------------------------------------------------------------------------------------------------------------------------

 

使用 Association 方法, 需要把 User 查询好, 然后根据 User 定义中指定AssociationForeignKey 去查找CreditCard。

查询某条数据使用first 查询唯一值

	u := &User{Id: 1}
	db.Debug().First(u)
	fmt.Println(u)
 
	db.Where("id=?",u.Id).First(u)
import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	gorm.Model
	UserName    string       `json:"username" gorm:"column:username"`
	CreditCards []CreditCard `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}

type CreditCard struct {
	gorm.Model
	Number string
	UserID int
}

func main() {
	dsn6 := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
	db, _ := gorm.Open(mysql.Open(dsn6), &gorm.Config{})
	db.AutoMigrate(&User{}, &CreditCard{})



    //查找 用户名为 lucas 的所有信用卡信息
	u1 := &User{UserName: "lucas"}

    //Association必须要先查出User才能关联查询对应的CreditCard
	db.First(u1)

	db.Model(u1).Association("CreditCards").Find(&u1.CreditCards)
	fmt.Println(u1)
}

这里只查找了creditcard

[1.513ms] [rows:2] SELECT * FROM `credit_cards` WHERE `credit_cards`.`user_id` = 1 AND `credit_cards`.`deleted_at` IS NULL
associate是先去获取user,再去获取creditcard !!!!!!!!!

var u User
db.Debug().Where("name = ?", "lucas").Find(&u)
fmt.Println(u)
[2.756ms] [rows:1] SELECT * FROM `user` WHERE name = 'lucas'
{1 lucas []}
// 关联查询的结果,保存到user.CreditCard属性

db.Debug().Model(&u).Association("Articles").Find(&u.Articles)
fmt.Println(u)
[0.712ms] [rows:2] SELECT * FROM `article` WHERE `article`.`user_id` = 1
{1 lucas [{1 k8s 1 {0  []}} {2 golang 1 {0  []}}]} 
	a := make([]Article, 10)
	var u User
	db.Take(&u, 3)
	db.Model(&u).Association("Articles").Find(&a)
	fmt.Println(u)
	fmt.Println(a)

{3 lucas []}
[{4 golang 3 {0  []}} {5 k8s 3 {0  []}}]

联表  Association


外键设定

一旦能接受新的模式,就可以说一说外键设定了,两个结构体之间相互关联,最直接的想法是我怎么从一个结构体出发然后去获得另一个结构体。

外键

如果我需要通过User去查找它拥有哪些CreditCard, 那么实际上我做的事情 = "拿着User主键去CreditCard表查询". 

一旦理解外键是怎么设置的, 我们就可以开始用上外键了, 概念:Association 是一个笼统的工具, 用于管理所有关联关系,以上面的Card&User为例,,我们来管理以上两表之间的关联关系(上面两表,采用默认外键/主键的方式相互关联)

cs := []CreditCard{}

xiaohan := &User{
	Model:gorm.Model{
		ID:1,
	},
}
 
// 所有与xiaohan(id=1)相关联的CreditCard,找出来
d.Model(xiaohan).Association("CreditCards").Find(&cs)
 
// xiaohan数据取消与ID=1的CreditCard取消关联
d.Model(xiaohan).Association("CreditCards").Delete(&CreditCard{
	Model:gorm.Model{
		ID:1,
	},
})

model 先拿到这张表,然后去连接tags第三张表。之后就是最关键的要去执行什么操作,这个操作可以是delete clean append

// xiaohan与CreditCard之间添加关联 
d.Model(xiaohan).Association("Languages").Append(&cards)

// 取消所有关联
db.Model(xiaohan).Association("Languages").Clear()

// 对象关联计数
db.Model(xiaohan).Association("Languages").Count()

更多推荐

数据结构之时间复杂度&&空间复杂度的计算

数据结构:计算机如何存储数据的问题。DS关心的是如何高效的进行数据的读写。算法:在特定的数据集上(不关心怎么进行具体数据的读写),如何利用数据完成特定的功能。算法本质上就是一系列运算的先后集合。那么,如何评价一个算法的好坏?从两种维度进行:时间效率与空间效率时间复杂度:主要衡量一个算法的运行速度(不是实际计算机的运行速

Java实现单链表

目录一.单链表二.单链表基本操作的实现1.单链表类、属性的定义2.求链表长度3.链表是否包含值为key的节点4.添加元素5.删除节点6.清空链表三、完整代码一.单链表链表是一种在物理存储结构上非连续的存储结构,数据元素的逻辑顺序通过链表中的引用链接次序实现。链表的结构多样,我们通过实现无头单向非循环链表,来进一步理解链

【记录成长】大学时光已过半, 分享我的大二暑期实习经历

你好,我是cpt,本文章记录我大二暑期找实习的过程,以及工作中的点点滴滴,还有一些经验分享,希望能够帮助到你。实习投递(BOSS1k沟通10+面)投递我是2023.6.16才开始投递的当时真的很晚了基本很少hc而且小公司基本不要大二学生下面这两篇短文是当时面试遇到的问题25三本鼠鼠投500面试0难QAQ_牛客网请问各位

Opengl绘制三角形

节点对象学习:顶点数组对象:VertexArrayObject,VAO顶点缓冲对象:VertexBufferObject,VBO:表示存储在GPU显存中的大量顶点数据。我们可以通过这个对象,一次性向GPU发送大量的数据,而不是一次次地从CPU中发送数据到GPU,这是个很慢的过程。元素缓冲对象:ElementBuffer

三步实现Mybatis(Mybatis-Plus)多数据源配置

前言要实现多数据源可以采用dynamic-datasource或者mybatis-mate,本文就以dynamic-datasource为例dynamic-datasource简介springboot快速集成多数据源的启动器使用文档(opensnewwindow)支持数据源分组,适用于多种场景纯粹多库读写分离一主多从混

SpringBoot实战案例:图书管理系统

SpringBoot实战案例:图书管理系统在本文中,我们将介绍如何使用SpringBoot框架构建一个简单的图书管理系统。我们将从零开始,逐步完成系统的搭建。本文将分为以下七个部分:系统需求分析搭建项目框架实现数据访问层实现业务逻辑层实现控制层前端页面与交互测试与部署1.系统需求分析在开始构建图书管理系统之前,我们首先

SpringBoot-接口幂等性

幂等幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂等方法是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。尤其是支付、订单等与金钱挂钩的服务,保证接口幂等性尤其重要。在实际开发中,我们需要针对不同的业务场景我们需要灵活的选

spring framework 5.2文档 - 控制反转 IoC 容器

IoC主题1.容器概述2.bean概述3.依赖注入(DI)4.Bean的范围5.定制一个beanSpring框架最重要的是控制反转(IoC)容器1.容器概述org.springframework.context.ApplicationContext接口代表SpringIoC容器,负责实例化、配置和组装bean。容器通过

竹云董事长董宁受邀出席香港第三届湾区元宇宙大会暨AIGC、RWA发展高峰论坛并作主题演讲

“一元初分,宇宙万仪”。9月16日,第三届湾区元宇宙大会暨AIGC、RWA发展高峰论坛在香港圆满落幕。全球权威机构、顶级专家学者、杰出企业家代表齐聚一堂,畅所欲言,全面总结分析元宇宙现状,综合研判元宇宙未来发展趋势。大会由香港区块链技术应用协会主办,粤港澳大湾区青年总会、香港国际投资总会、国际数据协会、联合国数字安全联

MySQL只同步单个表或多个表,非全部同步!

replicate-do-table是MySQL复制配置中的一个选项,它允许您指定要在从服务器上复制的表。如果您想要只复制主服务器上特定的表到从服务器,您可以使用这个选项。以下是如何操作replicate-do-table的步骤:停止从服务器:在从服务器上执行以下命令来停止复制:STOPSLAVE;编辑MySQL配置文

量化分析革新金融服务软件的三种方式

金融服务软件行业爱死量化分析了。为什么呢?因为在这个本质上不可预测的行业中,量化分析提供了一种确定性,或者至少是类似于确定性的东西。市场总是在变动,利润也起伏不定。交易达成了,然后落空,又再次达成,从交易大厅到董事会,纳秒级的差异可能成就巨大成功或带来重大损失。如果没有量化分析,我们难以预测这些事情会在何时、何地、以何

热文推荐