has one 与另一个模型建立一对一的关联,但它和一对一关系有些许不同。 这种关联表明一个模型的每个实例都包含或拥有另一个模型的一个实例。
例如,您的应用包含 user 和 credit card 模型,且每个 user 只能有一张 credit card。
- 创建model
// User 有一张 CreditCard,UserID 是外键
type User struct {
gorm.Model
CreditCard CreditCard
}
type CreditCard struct {
gorm.Model
Number string
UserID uint
}
对于 has one 关系,同样必须存在外键字段。拥有者将把属于它的模型的主键保存到这个字段。
这个字段的名称通常由 has one 模型的类型加上其 主键 生成,对于上面的例子,它是 UserID。
为 user 添加 credit card 时,它会将 user 的 ID 保存到自己的 UserID 字段。
如果你想要使用另一个字段来保存该关系,你同样可以使用标签 foreignKey 来更改它,例如:
// User 有一张 CreditCard,UserName 是外键
type User struct {
gorm.Model
CreditCard CreditCard `gorm:"foreignKey:UserName"` // 使用 UserName 作为外键
}
type CreditCard struct {
gorm.Model
Number string
UserName string //存储user表的主键id
}
- 创建表
package mysqltest
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
var db *gorm.DB
func Initdb() {
dsn := "ellis:ellis@tcp(192.168.214.134:3306)/go_db?charset=utf8mb4&parseTime=True&loc=Local"
var err error
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
}
func Create(value interface{}) {
d := db.Create(value)
fmt.Printf("d.RowsAffected: %v\n", d.RowsAffected)
}
func InitTable() {
db.AutoMigrate(&User{}, &CreditCard{})
}
- 多态
GORM 为 has one 和 has many 提供了多态关联支持,它会将拥有者实体的表名、主键值都保存到多态类型的字段中。
type Toy struct {
ID int
Name string
OwnerID int
OwnerType string
}
type Cat struct {
ID int
Name string
Toy Toy `gorm:"polymorphic:Owner;"`
}
type Dog struct {
ID int
Name string
Toy Toy `gorm:"polymorphic:Owner;"`
}
db.Create(&Dog{Name: "dog1", Toy: Toy{Name: "toy1"}})