专栏首页hotqin888的专栏gorm查询嵌套结构体,嵌套预加载preload,关联,外键foreignkey,引用references

gorm查询嵌套结构体,嵌套预加载preload,关联,外键foreignkey,引用references

gorm还真是难,也是因为它强大。

v2.0太多变化,所以还不敢用。下面是v1.0的。

花了好长时间试验,才得到了自己想要的结果。

一直想用gorm查询到嵌套结构体,可惜自定义嵌套结构体好像不支持?下次按这个思路再试试,可能也行哦。

用join查询虽然强大,但是无法将查询结构映射到嵌套结构体。

下面3个结构体是嵌套关系,3层嵌套(或是2层嵌套)

奇怪的是,官网对foreignkey的理解和实际使用不一致,比如https://blog.csdn.net/daimading/article/details/85258007

我的也是

//出差登记信息表
type Business struct {
	ID            uint      `json:"id" gorm:"primary_key"`
	CreatedAt     time.Time `gorm:"autoCreateTime"`
	UpdatedAt     time.Time
	DeletedAt     *time.Time
	BusinessUsers []BusinessUser
}

//出差人员表
type BusinessUser struct {
	gorm.Model
	UserID     int64 // 外键 (属于), tag `index`是为该列创建索引
	BusinessID uint  `json:"businessid"` //这个对应business表中的ID
	NickNames  NickName `gorm:"foreignkey:UserID"` //加不加这个references:UserID没所谓,奇怪
}

// 按道理,上面应该是`gorm:"foreignkey:ID;references:UserID"`,即主表businessuser中的USERID=
// =从表中的ID啊

type NickName struct {
	gorm.Model
	NickName string
}

func init() {
	_db.CreateTable(&Business{}, &BusinessUser{}, &NickName{})
}

下面开始查询

// 查出未过期的出差活动
func GetAllBusiness(projectid int64) (business []Business, err error) {
	// 坑:preload里不是对应的表的名字,而是主表中字段名字!!!
	//join一定要select,其他不用select的话默认查询全部。
	// Preload("BusinessUsers.NickNames")——嵌套预加载!!
	db := GetDB()
	err = db.Order("business.updated_at desc").
		Preload("BusinessUsers").Preload("BusinessUsers.NickNames").Where("business.project_id = ?", projectid).
		Where("end_date > ?", time.Now()).
		Find(&business).Error
	return business, err
}

注意:

// 注释:Has Many一对多的外键、引用
// 1.默认外键是 从表中的字段为 主表模型的类型(type)加上其 主键(ID) 生成 ,如:从表card中的UserID
// 2.可以改变外键`gorm:"foreignKey:UserName"`
// 3.可以改变引用references:MemberNumber
// 4.用preload来查询关联,preload中的名字必须是主表中的字段名,不是从表名
// 5.不必是gorm建立的表才能这样用,beego orm建立的表也可以用
// 6.嵌套预加载中的foreignkey似乎反了?

// User 有多张 CreditCard,UserID 是外键
// type User struct {——主表
//   gorm.Model
//   CreditCards []CreditCard
// }

// type CreditCard struct {——从表
//   gorm.Model
//   Number string
//   UserID uint——这个是默认外键(主表名+ID),对应User主表中的ID,gorm.Model意味着ID和created等
// }

// type User struct {
//   gorm.Model
//   MemberNumber string
//   CreditCards  []CreditCard `gorm:"foreignKey:UserNumber;references:MemberNumber"`
// }
上面搞反了么?好奇怪。

// type CreditCard struct {
//   gorm.Model
//   Number     string
//   UserNumber string——外键,这个值等于User表中的MemberNumber时,则查询到
// }

查询结果

[
  {
    "id": 1,——这个id等于下面的businessid
    "CreatedAt": "2020-12-13T11:54:06.0475717Z",
    "UpdatedAt": "2020-12-13T11:54:06.0475717Z",
    "DeletedAt": null,
    "BusinessUsers": [
      {
        "ID": 2,
        "CreatedAt": "2020-12-13T11:54:06.4675958Z",
        "UpdatedAt": "2020-12-13T11:54:06.4675958Z",
        "DeletedAt": null,
        "UserID": 9,——这个userid===下面的Id
        "businessid": 1,——这个businessid===上面的id
        "NickNames": {
          "Id": 9,——这个Id===上面的UserID
          "name": "qin.xc",
          "Nickname": "秦晓川",
        }
      }
    ],
  }
]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • gorm多条数据级联查询关联查询gorm连接池gorm事务

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    hotqin888
  • Go语言 orm库之gorm

    孤烟
  • Go语言 orm库之gorm

    孤烟
  • Android Room 持久化库

    佛系编码
  • Laravel源码分析之模型关联

    上篇文章我们主要讲了Eloquent Model关于基础的CRUD方法的实现,Eloquent Model中除了基础的CRUD外还有一个很重要的部分叫模型关联,...

    KevinYan
  • Go开源ORM——GORM

    可以通过定义嵌套gorm.Model这个结构体的类型来定义实体类,gorm.Model中定义了数据库表的一些常用基本字段

    歪歪梯
  • 前端性能优化

    前端性能优化与重绘与回流有关系的原因是:频繁的触发重绘与回流,会导致UI频繁染,最终会导致js变慢,会导致页面性能变差

    javascript艺术
  • MyBatis的“基于嵌套select”映射的剖析

    本文详细分析了MyBatis中“基于嵌套select”映射策略的性能缺陷、并给出了具体的实施建议,本文适合对MyBatis有一定使用经验的读者阅读,对MyBat...

    疯狂软件李刚
  • Android架构组件Room的使用详解

    Room其实就是一个orm,抽象了SQLite的使用,但是它作为Android的亲儿子orm,并且原生支持LiveData和Rxjava嵌套使用,学习一下还是不...

    砸漏
  • gorm源码2 tag映射

    分析model_struct.go下的ModelStruct, StructField 和Relationship

    平凡的学生族
  • Android架构组件Room指南

    Room是Google推出的Android架构组件库中的数据持久化组件库, 也可以说是在SQLite上实现的一套ORM解决方案。

    砸漏
  • Gorm 实践指南

    GORM 默认的数据更新、创建都在事务中,如无必要,可以关闭默认的事务,获得更大的性能提升, 事务的全局性或者临时关闭,即使在关闭默认事务,仍然可以通过方法 B...

    王小明_HIT
  • MyBatis:复杂映射,配置深入

    使用 #{arg0}-#{argn} 或者 #{param1}-#{paramn} 获取参数

    RendaZhang
  • Mybatis中三种关联关系的实现

    嵌套查询相当于进行了两次查询,而连接查询将两张表连接然后再进行查询,这样只进行了一次查询

    Java_老男孩
  • mybatis教程2(配置文件)

    MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息。文档的顶层结构如下:

    用户4919348
  • Java EE之SSM框架整合开发 -- (7) MyBatis映射器

    2.在MyBatis中针对不同的数据库软件,<insert>元素如何将主键回填?

    浩Coding
  • Gorm 使用

    使用 ORM 工具,通常需要在代码中定义模型(Models)与数据库中的数据表进行映射, 在 GORM 中模型(Models)通常是正常的结构体、基本的 go...

    王小明_HIT
  • Cocos Creator 编辑器扩展:一键查找资源引用

    当你想要确定一个资源被哪些节点引用的时候,使用资源管理器的查找引用却只能精确到预制体或场景。

    陈皮皮
  • Mybatis 详解

      每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlS...

    Demo_Null

扫码关注云+社区

领取腾讯云代金券