GORM 关联查询

GORM 关联查询

jouyouyun · 2018-12-05 11:34:43 · 4736 次点击 · 预计阅读时间 2 分钟 · 4分钟之前 开始浏览    
这是一个创建于 2018-12-05 11:34:43 的文章,其中的信息可能已经有所发展或是发生改变。

定义了一个 User 和 CompanyUser 中可以包含多个 Company, 如下:

type User struct {
        ID        int        `gorm:"TYPE:int(11);NOT NULL;PRIMARY_KEY;INDEX"`
        Name      string     `gorm:"TYPE: VARCHAR(255); DEFAULT:'';INDEX"`
        Companies []Company  `gorm:"FOREIGNKEY:UserId;ASSOCIATION_FOREIGNKEY:ID"`
        CreatedAt time.Time  `gorm:"TYPE:DATETIME"`
        UpdatedAt time.Time  `gorm:"TYPE:DATETIME"`
        DeletedAt *time.Time `gorm:"TYPE:DATETIME;DEFAULT:NULL"`
}

type Company struct {
        gorm.Model
        Industry int    `gorm:"TYPE:INT(11);DEFAULT:0"`
        Name     string `gorm:"TYPE:VARCHAR(255);DEFAULT:'';INDEX"`
        Job      string `gorm:"TYPE:VARCHAR(255);DEFAULT:''"`
        UserId   int    `gorm:"TYPE:int(11);NOT NULL;INDEX"`
}

在查询 User 时希望把 Company 的信息也一并查询, 有以下三种方法:

Related

使用 Related 方法, 需要把把 User 查询好, 然后根据 User 定义中指定的 FOREIGNKEY 去查找 Company, 如果没定义, 则调用时需要指定, 如下:

var u User
db.First(&u)
db.Model(&u).Related(&u.Companies).Find(&u.Companies)

User 列表时遍历列表一一查询 Company

Association

使用 Association 方法, 需要把把 User 查询好, 然后根据 User 定义中指定的 AssociationForeignKey 去查找 Company必须定义, 如下:

var u User
db.First(&u)
db.Model(&u).Association("Companies").Find(&u.Companies)

Preload

使用 Preload 方法, 在查询 User 时先去获取 Company 的记录, 如下:

// 查询单条 user
var u User
db.Debug().Preload("Companies").First(&u)
// 对应的 sql 语句
// SELECT * FROM users LIMIT 1;
// SELECT * FROM companies WHERE user_id IN (1);

// 查询所有 user
var list []User
db.Debug().Preload("Companies").Find(&list)
// 对应的 sql 语句
// SELECT * FROM users;
// SELECT * FROM companies WHERE user_id IN (1,2,3...);
posted @   技术颜良  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2023-06-17 go 接口循环方法
2023-06-17 Go设计模式实战--用状态模式实现系统工作流和状态机
2022-06-17 浅谈Docker-compose中的depends_on顺序的问题解决
2022-06-17 chrony时间同步服务简介及配置
2021-06-17 Filebeat是如何工作的
2019-06-17 用包来组织模型
2019-06-17 使用装饰器配置路由的
点击右上角即可分享
微信分享提示