主表字段中有一个子表的集合,子表存主表的关联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主子表查询 学习笔记相关推荐

  1. 三、MySQL子查询学习笔记(标量子查询、列子查询、行子查询、表子查询 详解)

    三.MySQL子查询学习笔记 7:子查询 含义: 一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询:在外面的查询语句,称为主查询或外查询 分类: 一 ...

  2. Dom4j 解析Xml文档及 XPath查询 学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> 本文查阅方法:     1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题     2.快捷"查找" ...

  3. ElasticSearch查询学习笔记章节5——geo_distance,geo_bounding_box,geo_polygon地图检索geo查询

    ElasticSearch查询笔记目录   涉及的常用查询内容较多,将分多个章节进行笔记整理,具体如下: ElasticSearch查询学习笔记章节1--term,terms,match,id查询   ...

  4. MyBatis主子表查询

    一.Mybatis查询语句 <select id="selectByProblemId" resultMap="findByProblemId">S ...

  5. oracle v$ 表,【学习笔记】Oralce视图 查找分析V$PARAMETER视图的基表

    天萃荷净 分享一篇关于查找分析V$PARAMETER视图的基表的案例方法 1.使用trace查找show parameter执行语句 alter session set events '10046 t ...

  6. 二、MySQL连接查询学习笔记(多表连接查询:内连接,外连接,交叉连接详解)

    MySQL连接查询(多表连接查询:内连接,外连接,交叉连接详解) 6:多表连接查询 笛卡尔乘积:如果连接条件省略或无效则会出现 解决办法:添加上连接条件 连接查询的分类: 1.按年代分类:1)sql ...

  7. mysql3.5 所有表_mysql学习笔记3.5

    紧接着笔记3的训练 介绍一个对于我来说的比较难的难点!!!! select * from sc; select student.sno,sname,avg(grade) as平均分fromstuden ...

  8. 一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)

    DQL语言的学习 一.基础查询 语法: **SELECT 要查询的东西 [FROM 表名];**类似于Java中 :System.out.println(要打印的东西); 特点: ①通过select查 ...

  9. Dom4j 解析Xml文档及XPath查询 学习笔记

    本文查阅方法:     1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题     2.快捷"查找" -- 在当前浏览器页面,按键 "Ctrl+F" 按键 ...

最新文章

  1. XMPP iOS客户端实现三:登录、注册
  2. 带你少走弯路:强烈推荐的TensorFlow快速入门资料和翻译(可下载)
  3. Quartz 第六课 CronTrigger(官方文档翻译)
  4. iOS10 打开APP设置界面和WIFI界面
  5. 爱库存:已实名举报唯品会不正当竞争行为
  6. 改良版class选择器
  7. Don't Make Me Think
  8. 项目质量管理在民航业中的应用
  9. python3简单爬取妹纸图网站图片
  10. IOS 模拟器清除缓存
  11. JAVA基于UDP的一个聊天程序
  12. 001.Heartbeat简介
  13. Zynga公布2020年第三季度财务业绩
  14. 安装内网穿透Frps
  15. java 6面骰子_《剑指offer》 面试题43 n个骰子的点数 (java)
  16. 好用的区块链浏览器--BlockScout安装
  17. 戴尔电脑重装系统的blos设置
  18. 【20210823】学习本不应该痛苦人生其实是一种享受
  19. 【小5聊】layui第三方插件-xm-select参数
  20. 【牛津大学博士论文】关系数据的学习和推理

热门文章

  1. FPGA经验谈系列文章——前言和目录
  2. PHP 实现阿里云短信API对接(登录/注册参考)
  3. 2022 十大科技趋势!达摩院年终预测重磅出炉:AI for Science 高居榜首
  4. adb教程(很详细)
  5. leaflet-editable
  6. js控制div内部滚动内容横向滑动位置
  7. 毕马威中国:证券基金经营机构信息技术审计项目发现洞察
  8. JPEG系列二 JPEG文件中的EXIF(下)
  9. c语言:购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。...
  10. python 评论分析_基于Python-Snownlp的新闻评论数据分析