Belongs To
belongs to
会与另一个模型建立了一对一的连接。 这种模型的每一个实例都“属于”另一个模型的一个实例。
例如,应用包含 user 和 company,并且每个 user 能且只能被分配给一个 company。
下面的类型就表示这种关系。 注意,在 User
对象中,有一个和 Company
一样的 CompanyID
。 默认情况下, CompanyID
被隐含地用来在 User
和 Company
之间创建一个外键关系, 因此必须包含在 User
结构体中才能填充 Company
内部结构体。
// `User` 属于 `Company`,`CompanyID` 是外键
type User struct {
gorm.Model
Name string
CompanyID int
Company Company
}
type Company struct {
ID int
Name string
}
Has Many
has many
与另一个模型建立了一对多的连接。 不同于 has one
,拥有者可以有零或多个关联模型。
例如,应用包含 user 和 credit card 模型,且每个 user 可以有多张 credit card。
声明
// User 有多张 CreditCard,UserID 是外键
type User struct {
gorm.Model
CreditCards []CreditCard
}
type CreditCard struct {
gorm.Model
Number string
UserID uint
}
检索
// 检索用户列表并预加载信用卡
func GetAll(db *gorm.DB) ([]User, error) {
var users []User
err := db.Model(&User{}).Preload("CreditCards").Find(&users).Error
return users, err
}
一对多关系
我们先从一对多开始多表关系的学习因为一对多的关系生活中到处都是,例如:
- 用户与文章
在创建的时候先将没有依赖的创建。表名称+ID就是外键。外键要和关联的外键的数据类型要保持一致。
Articles [ ]Article 这里必须是表名的复数。
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// User 用户表 一个用户拥有多篇文章
type User struct {
ID int64
Name string `gorm:"size:6"`
Articles []Article //用户拥有的文章列表 has many
}
// Article 文章表 一篇文章属于一个用户
type Article struct {
ID int64 `gorm:"size:4"`
Title string `gorm:"size:16"`
UserID int64 //属于 belongs to
User User //属于 belongs to
}
func (*User) TableName() string {
return "user"
}
func (*Article) TableName() string {
return "article"
}
func main() {
dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
db.Debug().AutoMigrate(&User{}, &Article{})
}
[40.909ms] [rows:0] CREATE TABLE `user` (`id` bigint AUTO_INCREMENT,`name` varchar(6),PRIMARY KEY (`id`))
[26.904ms] [rows:0] CREATE TABLE `article` (`id` tinyint AUTO_INCREMENT,`title` varchar(16),`user_id` bigint,PRIMARY KEY (`id`),CONSTRAINT `fk_user
_articles` FOREIGN KEY (`user_id`) REFERENCES `user`(`id`))