Copyright © 2022-2024 aizws.net · 网站版本: v1.2.6·内部版本: v1.23.3·
页面加载耗时 0.00 毫秒·物理内存 74.6MB ·虚拟内存 1303.8MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
Gorm 关联查询(又叫连表查询)中的 Has Many 关系是 一对多 的关联关系,通常用于描述一个 Model 拥有多个 Model。
比如:一个 用户拥有多张信用卡,下面以 Go Struct 表示表结构
// 用户 type User struct { // 继承gorm的基础Model,里面默认定义了ID、CreatedAt、UpdatedAt、DeletedAt 4个字段 gorm.Model CreditCards []CreditCard // 一对多关联属性,表示多张信用卡 } // 信用卡 type CreditCard struct { gorm.Model Number string // 卡号 UserID uint // 默认外键, 用户Id }
默认情况下,Gorm 使用持有关联属性的 类型名 + 主键ID 作为外键名。
如上例,User 使用 User + ID = UserID 作为外键名。
自定义外键:
type User struct { gorm.Model // 通过标签,将外键定义为:UserRefer CreditCards []CreditCard `gorm:"foreignkey:UserRefer"` } type CreditCard struct { gorm.Model Number string UserRefer uint // 新定义的外键名 }
外键和关联外键都是成对出现的,默认情况 Gorm 使用主键 ID,作为关联外键。
主键 ID,默认为 ID,如上面的例子,使用 User 的 ID 作为关联外键。
自定义关联外键:
type User struct { gorm.Model MemberNumber string // 关联外键字段 // 使用references定义关联外键名 CreditCards []CreditCard `gorm:"foreignkey:UserMemberNumber;references:MemberNumber"` } type CreditCard struct { gorm.Model Number string UserMemberNumber string // 外键字段 }
user := User{} // 查询用户数据 //自动生成sql: SELECT * FROM `users` WHERE (username = 'tizi365') LIMIT 1 db.Where("username = ?", "tizi365").First(&user) fmt.Println(user) //自动生成SQL: SELECT * FROM emails WHERE user_id = 111; // 111 是user的主键ID值 // 关联查询的结果,保存到user.CreditCard属性 db.Model(&user).Association("CreditCard").Find(&user.CreditCard)
Gorm 关联查询预加载 Preloading:默认情况下 Gorm 因为性能问题,不会自动加载关联属性的值,Gorm 通过 Preload 函数支持预加载(Eager loading)关联数据,下面介绍预加载关联数据的方法。