Gorm框架 关联查询 属于
Gorm 的关联查询(又叫连表查询)中的属于关系是一对一关联关系的一种,通常用于描述一个 Model属于另外一个 Model。
1. Gorm 关联查询范例
存在一个 users 表和 profiles 表:
- users - 用户表
- profiles - 用户个性化信息表
它们之间存在一对一关系,每一个用户都有自己的个性化数据,那么可以说每一条 profiles 记录都属于某个用户。
// 用户表 - 下面使用 golang struct 表示表结构 type User struct { // 继承 gorm 的基础 Model,里面默认定义了 ID、CreatedAt、UpdatedAt、DeletedAt 4个字段 gorm.Model Name string } // 个性化信息表 type Profile struct { gorm.Model UserID uint // 外键 // 定义 user 属性关联 users 表,默认情况使用 类型名 + ID 组成外键名,在这里 UserID 属性就是外键 User User Name string }
2. 外键
在关联查询中必须包含外键,默认 gorm 使用(关联属性类型 + 主键)组成外键名,如上面的例子 User + ID 组成 UserID,UserID 就作为 Profile 的外键。
也可以通过下面方式修改外键:
type Profile struct { gorm.Model Name string User User `gorm:"foreignkey:UserRefer"` //使用 UserRefer 作为外键 UserRefer uint // 外键 }
3. 关联外键
在连表操作中,除了外键,还需要一个关联外键组成一对才能完成连表,例如上面的例子,Profile 中 UserID 属性作为外键,它和 User 中的 ID 进行关联,这里 User 的 ID 就是关联外键。
默认 Gorm 使用主键作为关联外键,所以上面的 User 使用 ID 作为关联外键。
也可以自定义关联外键:
type User struct { gorm.Model Refer string // 关联外键 Name string } type Profile struct { gorm.Model Name string User User `gorm:"references:Refer"` // 使用 Refer 作为关联外键 UserRefer string }
4. 属于关联查询例子
profile := Profile{} // 查询用户个性数据 // 自动生成sql: SELECT * FROM `profiles` WHERE id = 1 AND `profiles`.`deleted_at` IS NULL LIMIT 1 db.Where("id = ?", 1).Take(&profile) fmt.Println(profile) user := User{} // 通过Profile关联查询user数据, 查询结果保存到user变量 db.Model(&profile).Association("User").Find(&user) fmt.Println(user) // 自动生成sql: SELECT * FROM `users` WHERE `users`.`id` = 1 // 1 就是user的 ID,已经自动关联
Gorm 关联查询 一对一关系(has one):Gorm 的关联查询(又叫连表查询)中的 Has One 关系是 一对一 关联关系的一种,通常用于描述一个 Model 拥有另外一个 Model。外键:关联查询必须包含外键,默认情况下 Has One 关系的外键由持有关联属性的类型名 + 主键 组成外键名。