Copyright © 2022-2024 aizws.net · 网站版本: v1.2.6·内部版本: v1.23.3·
页面加载耗时 0.00 毫秒·物理内存 63.6MB ·虚拟内存 1300.0MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
Gorm 的关联查询(又叫连表查询)中的 Has One 关系是 一对一 关联关系的一种,通常用于描述一个 Model 拥有另外一个 Model。
Has One 很像属于(belongs to)关系,都是一对一关系,区别是 Has One 关系和属于关系,持有关联 Model 属性的关系是相反的,例如:A 关联 B,Has One 关系通常是 A 结构体持有 B 属性,belongs to 关系则是 B 结构体持有 A。
比如:每一个用户都有一张信用卡,下面以 Go Struct 表示表结构:
// 信用卡 type CreditCard struct { // 继承 gorm 的基础 Model,里面默认定义了 ID、CreatedAt、UpdatedAt、DeletedAt 4个字段 gorm.Model Number string UserID uint // 外键 } // 用户 type User struct { gorm.Model CreditCard CreditCard // 持有信用卡属性(关联信用卡) }
关联查询必须包含外键,默认情况下 Has One 关系的外键由持有关联属性的类型名 + 主键 组成外键名,如上例,User 关联 CreditCard 的外键就是 User + ID = UserID。
通过下面方式可以自定义外键:
type CreditCard struct { gorm.Model Number string UserName string // 外键 } type User struct { gorm.Model // 通过标签将外键定义为:UserName CreditCard CreditCard `gorm:"foreignkey:UserName"` }
默认情况下,保存 User 的时候,会自动将 User 的主键保存到外键 UserID 中,关联查询的时候,也会使用外键和关联外键进行关联进行查询,这里 User 的 ID 就是关联外键。
自定义关联外键的例子:
type CreditCard struct { gorm.Model Number string UID string } type User struct { gorm.Model Name `sql:"index"` // 关联外键 // 自定义关联外键为:name CreditCard CreditCard `gorm:"foreignkey:uid;references:name"` }
user := User{} // 查询用户数据 //自动生成sql: SELECT * FROM `users` WHERE (username = 'tizi365') LIMIT 1 db.Where("username = ?", "tizi365").First(&user) fmt.Println(user) var card CreditCard ////自动生成SQL: SELECT * FROM credit_cards WHERE user_id = 123; // 123 自动从user的ID读取 // 关联查询的结果会填充到card变量 db.Model(&user).Association("CreditCard").Find(&card)
Gorm 关联查询 一对多关系(Has Many):Gorm 关联查询(又叫连表查询)中的 Has Many 关系是 一对多 的关联关系,通常用于描述一个 Model 拥有多个 Model。外键:默认情况下,Gorm 使用持有关联属性的 类型名 + 主键ID 作为外键名。关联外键:外键和关联外键都是成对出现的,默认情况 Gorm 使用主键 ID,作为关联外键。