相关文章推荐
瘦瘦的海豚  ·  嵌套数组和map的json文件如何解析?开发者社区·  2 周前    · 
笑点低的肉夹馍  ·  hive解析json嵌套数组_mob64ca ...·  2 周前    · 
买醉的梨子  ·  jQuery if条件用于多个.val下拉框的值·  11 月前    · 
爱搭讪的大蒜  ·  机器理解大数据的秘密:聚类算法深度详解 - 知乎·  1 年前    · 
谈吐大方的警车  ·  VBA数据库解决方案第18讲:数据库中Rec ...·  1 年前    · 
飞奔的苦咖啡  ·  MongoError: connect ...·  1 年前    · 
打酱油的猴子  ·  如何将Python调用的os.system命 ...·  1 年前    · 
Code  ›  gorm查询嵌套结构体,嵌套预加载preload,关联,外键foreignkey,引用references开发者社区
外键 嵌套
https://cloud.tencent.com/developer/article/1761906
小胡子的日光灯
1 年前
hotqin888
0 篇文章

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

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
hotqin888
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > hotqin888的专栏 > gorm查询嵌套结构体,嵌套预加载preload,关联,外键foreignkey,引用references

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

作者头像
hotqin888
发布 于 2020-12-16 18:11:23
5K 0
发布 于 2020-12-16 18:11:23
举报

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",
 
推荐文章
瘦瘦的海豚  ·  嵌套数组和map的json文件如何解析?开发者社区
2 周前
笑点低的肉夹馍  ·  hive解析json嵌套数组_mob64ca12f55920的技术博客_
2 周前
买醉的梨子  ·  jQuery if条件用于多个.val下拉框的值
11 月前
爱搭讪的大蒜  ·  机器理解大数据的秘密:聚类算法深度详解 - 知乎
1 年前
谈吐大方的警车  ·  VBA数据库解决方案第18讲:数据库中Recordset对象Find方法的利用 - 知乎
1 年前
飞奔的苦咖啡  ·  MongoError: connect ECONNREFUSED 127.0.0.1:27017-腾讯云开发者社区-腾讯云
1 年前
打酱油的猴子  ·  如何将Python调用的os.system命令的错误信息反馈回来(Window)_os.system返回值 返回错误信息_万能菜道人的博客-CSDN博客
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号