gorm多表联合查询 Joins方法 LEFT JOIN , RIGHT JOIN , INNER JOIN, FULL JOIN 使用总结

news2024/12/27 13:43:04

gorm中多表联合查询,我们可以使用Joins来完成,这个Joins方法很灵活,我们可以非常方便的多多表进行联合查询, 我们先来看看这个方法的官方定义和使用示例:

Joins方法定义和使用示例

当然我们这里要说的使用方式是官方示例里面没有的,有的我们就不重复废话了。

从上面的方法定义我们可以看到,这个Joins的第一个参数query string 他就是一个查询字符串, 第二个参数是可变参数, 从这个参数定义就可以看出,这里的第一个参数query 就是我们需要进行多表链接的查询参数,这里的查询参数可以是任何的SQL支持的链接查询语句,如 LEFT JOIN , RIGHT JOIN ,  INNER JOIN, FULL JOIN等。

gorm中的这个Joins方法,我们可以直接将我们需要的链接方式和链接条件都写在这个查询字符串里面即可,如果有参数可以跟在后面,参数可以使用问号? 占位符方式 或者 @xxx 命名参数方式传递。

LEFT JOIN 左链接使用示例


// 获取用户拥有的角色ID和值的对象数组
func (s *roleSvc) GetRoleIdsValByUid(c *ginx.XContext, uid int32) ([]int64, error) {
	var roleIds []int64
	m := global.GetTx("sys_role c").Select("c.role_id")
	m = m.Joins("LEFT JOIN sys_user_role ur on ur.role_id = c.role_id")
	m = m.Joins("LEFT JOIN sys_user u on u.uid = ur.uid")
	m = m.Where("c.del_flag = '0' and u.del_flag = '0'")
	m = m.Where("ur.uid = ?", uid)
	err := m.Pluck("c.role_id", &roleIds).Error
	if err != nil {
		return nil, myerror.New("未查询到用户角色数据数据 " + err.Error())
	}
	return roleIds, nil
}

其他的链接方式使用都是一样的,只是不同的链接方式输出的结果不一样而已。

其语法一般为:  链接方式  表名 别名  ON 链接条件   如: LEFT JOIN sys_user u on u.uid = ur.uid

常用SQL JOIN的语义

  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行 这个用得最多
  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
  • INNER JOIN:如果表中有至少一个匹配,则返回行
  • FULL JOIN:只要其中一个表中存在匹配,则返回行

Gorm Joins链接代码参考


// Joins specify Joins conditions
//
//	db.Joins("Account").Find(&user)
//	db.Joins("JOIN emails ON emails.user_id = users.id AND emails.email = ?", "jinzhu@example.org").Find(&user)
//	db.Joins("Account", DB.Select("id").Where("user_id = users.id AND name = ?", "someName").Model(&Account{}))
func (db *DB) Joins(query string, args ...interface{}) (tx *DB) {
	return joins(db, clause.LeftJoin, query, args...)
}

// InnerJoins specify inner joins conditions
// db.InnerJoins("Account").Find(&user)
func (db *DB) InnerJoins(query string, args ...interface{}) (tx *DB) {
	return joins(db, clause.InnerJoin, query, args...)
}

func joins(db *DB, joinType clause.JoinType, query string, args ...interface{}) (tx *DB) {
	tx = db.getInstance()

	if len(args) == 1 {
		if db, ok := args[0].(*DB); ok {
			j := join{
				Name: query, Conds: args, Selects: db.Statement.Selects,
				Omits: db.Statement.Omits, JoinType: joinType,
			}
			if where, ok := db.Statement.Clauses["WHERE"].Expression.(clause.Where); ok {
				j.On = &where
			}
			tx.Statement.Joins = append(tx.Statement.Joins, j)
			return
		}
	}

	tx.Statement.Joins = append(tx.Statement.Joins, join{Name: query, Conds: args, JoinType: joinType})
	return
}

总结

Gorm中官方只提供了2个相关的Join方法,一个就是Joins, 另外一个时 InnerJoins, 他们最终都调用的joins方法。 我们可根据我们的业务需求直接将我们需要的链接查询语句放到这里的query参数里面, gorm就会为我们生成对应的查询SQL。 需要注意的是,这里的Joins方法,如果我们指定了链接条件, 则这里就必须要手动指定链接方式,如.Joins("LEFT JOIN sys_user_role ur on ur.role_id = c.role_id")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1927803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络运输层之(2)UDP协议

网络运输层之(2)UDP协议 Author: Once Day Date: 2024年7月14日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CSDN…

SQL server 练习题2

课后作业 作业 1:自己查找方法,将 homework_1.xls 文件数据导入到 SQLServer 的 homework 数据库中。数据导入完成后,把表名统一改为:外卖表 如下所示: 作业 2:找出所有在 2020 年 5 月 1 日至 5 月 31 …

离散数学,自反和反自反 ,对称和反对称,传递关系 ,复合关系和逆关系 ,关系的闭包

目录 1.自反和反自反 自反性 反自反性 判断关系是自反或是反自反 2.对称和反对称 对称性 反对称性 判断关系是对称或是反对称 3.传递关系 4.复合关系和逆关系 复合关系 逆关系 关系运算的性质 5.关系的闭包 闭包的性质 1.自反和反自反 自反性 反…

适合初创企业的有效 CRM 策略

客户关系管理 (CRM) 是任何企业的重要组成部分,尤其是对于旨在与客户建立牢固而有意义的关系的初创公司而言。实施良好的 CRM 策略不仅可以简化您的销售流程,还可以提高客户满意度和保留率。在本文中,我们将介绍初创公司有效 CRM 策略的关键组…

原生APP外包开发成本的估算

原生APP外包开发成本的估算取决于多种因素。根据经验,原生APP外包开发成本一般在几十万到几百万人民币之间。对于功能复杂、要求高的大型APP,开发成本可能更高,甚至达到上千万人民币。北京木奇移动技术有限公司,专业的软件外包开发…

前端Vue组件化实践:自定义银行卡号格式化组件的探索与应用

在前端开发中,随着业务逻辑的复杂化和应用规模的扩大,传统的一体式开发方式逐渐显露出其局限性。任何微小的改动或新功能的增加都可能牵一发而动全身,导致整体逻辑的修改,进而增加了开发成本和维护难度。为了解决这一问题&#xf…

Linux系统的用户组管理和权限以及创建用户

1.Linux是多用户的操作系统,正如在Windows系统中可以进行用户账号的切换,Linux同样允许多用户操作。在Linux服务器环境中,通常由多名运维人员共同管理,而这些运维人员各自拥有不同的权限和级别。因此,我们可以根据每个…

基于openEuler-22.03-LTS-SP4搭建openstack-t版

openstack 环境初始化安装基础服务安装keystone服务安装glance服务安装placement服务安装nova服务安装neutron服务安装dashboard服务 官网教程 实验环境:VMware17,配置4c4r100G,搭建单节点openstack,组件搭建到dashboard 主机名…

猎人竞技场革命怎么下载 猎人竞技场革命测试资格获取+下载教程分享

《猎人竞技场:革命》是一款多人在线动作游戏,该游戏于近日正式公布,这款游戏的故事背景设定在古代东方,玩家需要扮演一名猎人在充满敌人的世界中生存下来并逃离。为了达成这个目标,玩家需要结合各种技能、装备和战术&a…

泛微开发修炼之旅--37通过js实现监听下拉框,并触发后端接口,改变其他控件内容的实现方法与源码(含pc端和移动端实现)

文章链接:37通过js实现监听下拉框,并触发后端接口,改变其他控件内容的实现方法与源码(含pc端和移动端实现)

GaussDB DWS 详解

文章目录 GaussDB DWS 详解一、简介二、DWS的分布式架构架构概述关键组件 三、分布式查询数据查询流程SQL执行的示例 批注:本文引鉴了Forlogen博主的一些内容,并加以补充,以供学习了解。 GaussDB DWS 详解 一、简介 DWS(Data Warehouse Ser…

Qt进阶版五子棋

五子棋是一种两人对弈的棋类游戏,目标是在横、竖、斜任意方向上连成五个子。在Qt中实现五子棋程序,你需要设计棋盘界面、处理下棋逻辑、判断胜负等。以下是实现一个基本五子棋程序的步骤: 创建项目和界面 使用Qt Creator创建一个新的Qt Widge…

AutoMQ 中的元数据管理

本文所述 AutoMQ 的元数据管理机制均基于 AutoMQ Release 1.1.0 版本 [1]。 01 前言 AutoMQ 作为新一代基于云原生理念重新设计的 Apache Kafka 发行版,其底层存储从传统的本地磁盘替换成了以对象存储为主的共享存储服务。对象存储为 AutoMQ 带来可观成本优势的…

基坑安全:自动化监测系统的革新力量

在日新月异的基坑工程领域,基坑安全自动化监测系统犹如一位守护者,以其独特的优势,为工程的安全与质量保驾护航。该系统集先进的测量仪器、计算机技术与现代传感技术于一体,对基坑的围护结构及周边环境进行全方位、高精度的实时监…

OpenGL笔记一之基础窗体搭建以及事件响应

OpenGL笔记一之基础窗体搭建以及事件响应 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记一之基础窗体搭建以及事件响应1.运行2.目录结构3.main.cpp4.CMakeList.txt 1.运行 2.目录结构 01_GLFW_WINDOW/ ├── CMakeLists.txt ├── glad.c ├── ma…

机器人及其相关工科专业课程体系

机器人及其相关工科专业课程体系 前言传统工科专业机械工程自动化/控制工程计算机科学与技术 新兴工科专业智能制造人工智能机器人工程 总结Reference: 前言 机器人工程专业是一个多领域交叉的前沿学科,涉及自然科学、工程技术、社会科学、人文科学等相关学科的理论…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】 本地事务事务的基本性质事务的隔离级别(下面四个越往下,隔离级 别越高,并发能力越差)事务的传播行为(是否…

花几千上万学习Java,真没必要!(七)

swtich语句: 测试代码1: package testswitch.com;//根据月份和年份,当月份是 2 时,检查年份是否为闰年,然后继续执行下一个 case,打印出"三月",然后终止switch 语句。 public class …

微软Edge浏览器深度解析:性能、安全性与特色功能全面评测

一、引言 自Windows 10操作系统推出以来,微软Edge浏览器作为默认的网页浏览器,凭借其现代化的设计和出色的性能表现,逐渐获得了用户的认可。本文旨在对Edge浏览器进行深入分析,探讨其在多个方面的表现。 二、界面与操作体验 界面…

力扣每日一题:807. 保持城市天际线

文章目录 ***今日份每日一题:***题目要求:示例如下:示例1示例2 解释剖析示例示例1示例2 将逻辑思路转换为代码 力扣官网:前往作答!!!! 今日份每日一题: 题目要求&#…