gorm Preload主子表查询 学习笔记
主表字段中有一个子表的集合,子表存主表的关联id,类似于这样的结构:
//主表
type User struct{ID intInfo []UserInfo //子表的数据
}//子表
type UserInfo struct{ID intUserId int //主表的id
}
我之前不太会,都是两个表分别查,然后在拼接在一起,相当的麻烦
然后大佬给了个方法,查sql的时候用一下 Preload ,直接就出来了
//主表
type User struct{ID intInfo []UserInfo `gorm:"foreignKey:UserId;"`
}func(User) TableName()string{return "user" //数据库对应的表名
}//子表
type UserInfo struct{ID intUserId int
}
user := make([]*User,0)
err := global.GVA_DB.Preload("Info").Find(&user).Error
//Preload 里面的字段是Info,不是UserInfo
会生成两条SQL语句
SELECT * FROM `user_info` WHERE `user_info`.`user_id` IN (1,2,3,4) AND `user_info`.`deleted_at` IS NULL
SELECT * FROM `user` WHERE `user`.`deleted_at` IS NULL
学艺不精啊,虽然好像看过sql的预加载,但是完全想不起来用。不愧是大佬啊,感谢升哥
-------------------------------------------------------------------------------------------------------
今天又用到了这个,想写一个能连接三张表的Proload, 但是总是不对,怎么也查不出来,改成两个表的还是不行,只是告诉我 :unsupported relations,我来来回回看了好几遍gorm文档,也没看出来有啥问题,网上搜索也没找到怎么解决。。。然后看了我之前的代码,唯一的区别就是,写的时候没有加model。。。
//这个是之前的成功的var customer []model.CustomerPackerr = global.GVA_DB.Where("id = ?",id).Preload("DistributePack").Find(&customer).Error//然后是这个var stowage []*response.StowageAreaGoods2err = global.GVA_DB.Model(&model.stowage).Preload("CustomerPack").Preload("CustomerPack.DistributePack").Find(&stowage).Error
按照我之前的理解,db.model() 的作用就是确定表名,生成sql后的from ‘表名’ 就是model里面的结构体的tableName方法确定的。因为单查询生成的sql语句 和preload查询的sql完全一样,所以导致我完全搞不懂那里有错误,为何Preload是不支持的关系。
最后实验发现,加Model( ) 也可以,只是model里面的结构体必须和上面定义的相同,类似于:
var stowage []*response.StowageAreaGoods2err = global.GVA_DB.Model(&response.StowageAreaGoods2{}).Preload("CustomerPack").Preload("CustomerPack.DistributePack").Find(&stowage).Error
那么db.model() 的作用也就明了了,确定各个结构体之间的关系,确定整体的结构,只是之前的查询都是单查询或者直接查视图,没有认识到model()的作用。
这样查出来的数据是三级的树形结构,同时需要在第二级按照其中一个“sequence”字段进行排序;如果直接加上 .Order() 方法是对第一级的stowage表排序,所以需要用到一个骚操作:
gorm实现多对多映射,以及预加载排序 - 简书
err = global.GVA_DB.Preload("CustomerPack", func(db *gorm.DB) *gorm.DB{return db.Order("sequence")}).Preload("CustomerPack.DistributePack").Find(&stowage).Error还可以这么写,不过第二种sql查询好像更加耗时err = global.GVA_DB.Preload("CustomerPack", func(db *gorm.DB) *gorm.DB{return db.Order("sequence").Preload("DistributePack")}).Find(&stowage).Error
生成的sql
二级的数据
SELECT * FROM `v_customer_pack` WHERE `v_customer_pack`.`stowage_id` IN (1,2,3) AND `v_customer_pack`.`deleted_at` IS NULL ORDER BY sequence三级的数据
SELECT * FROM `distribute_pack` WHERE `distribute_pack`.`customer_id` IN (3,1) AND `distribute_pack`.`deleted_at` IS NULL一级的数据
SELECT * FROM `stowage` WHERE `stowage`.`deleted_at` IS NULL
--------------------------------------------------------------------
Preload References 的用法
有种情况是 主子表不是通过主表id关联的
主表
type BackWarehouse struct {ID uint `json:"id"`BackNumber string `json:"backNumber" `BackType string `json:"backType" `BackStatus string `json:"backStatus" `CustomerId uint `json:"customerId" `TransportId uint `json:"transportId" `OrderId uint `json:"orderId" `
}子表
type OrderDetail struct {ID uint `json:"id"`OrderId int `json:"orderId" `ProductId int `json:"productId" `ProductCount int `json:"productCount"`BackCount uint `json:"backCount" `ProductCode string `json:"productCode"`
}现在要用 OrderId 关联两个表
type BackOrder struct {BackWarehouseOrderDetail []*OrderDetail `json:"order" gorm:"foreignKey:OrderId;references:OrderId"`
}
references 的作用就是确定用哪个字段链接,但是也不能没有foreignKey,没有就会报错 :
invalid field found for struct com-psms-server/model.BackOrder's field OrderDetail, need to define a valid foreign key for relations or it need to implement the Valuer/Scanner interface
无法识别`OrderDetail` 字段
gorm Preload主子表查询 学习笔记相关推荐
- 三、MySQL子查询学习笔记(标量子查询、列子查询、行子查询、表子查询 详解)
三.MySQL子查询学习笔记 7:子查询 含义: 一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询:在外面的查询语句,称为主查询或外查询 分类: 一 ...
- Dom4j 解析Xml文档及 XPath查询 学习笔记
2019独角兽企业重金招聘Python工程师标准>>> 本文查阅方法: 1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题 2.快捷"查找" ...
- ElasticSearch查询学习笔记章节5——geo_distance,geo_bounding_box,geo_polygon地图检索geo查询
ElasticSearch查询笔记目录 涉及的常用查询内容较多,将分多个章节进行笔记整理,具体如下: ElasticSearch查询学习笔记章节1--term,terms,match,id查询 ...
- MyBatis主子表查询
一.Mybatis查询语句 <select id="selectByProblemId" resultMap="findByProblemId">S ...
- oracle v$ 表,【学习笔记】Oralce视图 查找分析V$PARAMETER视图的基表
天萃荷净 分享一篇关于查找分析V$PARAMETER视图的基表的案例方法 1.使用trace查找show parameter执行语句 alter session set events '10046 t ...
- 二、MySQL连接查询学习笔记(多表连接查询:内连接,外连接,交叉连接详解)
MySQL连接查询(多表连接查询:内连接,外连接,交叉连接详解) 6:多表连接查询 笛卡尔乘积:如果连接条件省略或无效则会出现 解决办法:添加上连接条件 连接查询的分类: 1.按年代分类:1)sql ...
- mysql3.5 所有表_mysql学习笔记3.5
紧接着笔记3的训练 介绍一个对于我来说的比较难的难点!!!! select * from sc; select student.sno,sname,avg(grade) as平均分fromstuden ...
- 一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)
DQL语言的学习 一.基础查询 语法: **SELECT 要查询的东西 [FROM 表名];**类似于Java中 :System.out.println(要打印的东西); 特点: ①通过select查 ...
- Dom4j 解析Xml文档及XPath查询 学习笔记
本文查阅方法: 1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题 2.快捷"查找" -- 在当前浏览器页面,按键 "Ctrl+F" 按键 ...
最新文章
- XMPP iOS客户端实现三:登录、注册
- 带你少走弯路:强烈推荐的TensorFlow快速入门资料和翻译(可下载)
- Quartz 第六课 CronTrigger(官方文档翻译)
- iOS10 打开APP设置界面和WIFI界面
- 爱库存:已实名举报唯品会不正当竞争行为
- 改良版class选择器
- Don't Make Me Think
- 项目质量管理在民航业中的应用
- python3简单爬取妹纸图网站图片
- IOS 模拟器清除缓存
- JAVA基于UDP的一个聊天程序
- 001.Heartbeat简介
- Zynga公布2020年第三季度财务业绩
- 安装内网穿透Frps
- java 6面骰子_《剑指offer》 面试题43 n个骰子的点数 (java)
- 好用的区块链浏览器--BlockScout安装
- 戴尔电脑重装系统的blos设置
- 【20210823】学习本不应该痛苦人生其实是一种享受
- 【小5聊】layui第三方插件-xm-select参数
- 【牛津大学博士论文】关系数据的学习和推理
热门文章
- FPGA经验谈系列文章——前言和目录
- PHP 实现阿里云短信API对接(登录/注册参考)
- 2022 十大科技趋势!达摩院年终预测重磅出炉:AI for Science 高居榜首
- adb教程(很详细)
- leaflet-editable
- js控制div内部滚动内容横向滑动位置
- 毕马威中国:证券基金经营机构信息技术审计项目发现洞察
- JPEG系列二 JPEG文件中的EXIF(下)
- c语言:购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。...
- python 评论分析_基于Python-Snownlp的新闻评论数据分析