GORM 关联查询
jouyouyun · · 2802 次点击 · · 开始浏览定义了一个 User 和 Company, User 中可以包含多个 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...);
本文中是一对多, 一对一的也是类似的, 完整代码见: GORM Related
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
定义了一个 User 和 Company, User 中可以包含多个 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...);
本文中是一对多, 一对一的也是类似的, 完整代码见: GORM Related