Gorm 关联的使用
创建关联,进行关联操作,以及查询关联表数据
Go代码演示
数据类型定义
type User struct {
Id int64
Name string
Address string
Phone string
Orders []*Order
}
type Order struct {
Id int64
Amount int64
CreateAt int64
Goods []*Good
UserId int64
}
type Good struct {
Id int64
Name string
Price int64
OrderId int64
}
//go run main.go
package main
import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"log"
"time"
)
//使用一对多模型创建关联
//一个用户有多个订单,一个订单有多个商品
//一个用户包含很多订单,一个订单包含很多商品
type User struct {
Id int64
Name string
Address string
Phone string
Orders []*Order
}
type Order struct {
Id int64
Amount int64
CreateAt int64
Goods []*Good
UserId int64
}
type Good struct {
Id int64
Name string
Price int64
OrderId int64
}
func main() {
//链接数据库
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})
if err != nil {
panic(err)
}
//迁移表
err = db.AutoMigrate(&User{}, &Order{}, &Good{})
if err != nil {
panic(err)
}
//初始化关联数据
user := new(User)
user.Name = "guojinfei"
user.Address = "北京64胡同12号"
user.Phone = "15311119999"
user.Orders = []*Order{
&Order{
Amount: 1664,
CreateAt: time.Now().Unix(),
Goods: []*Good{
&Good{
Name: "雪梨",
Price: 128,
},
},
},
}
//创建数据,自动创建关联
tx := db.Create(&user)
tx = db.Save(&user)
if tx.Error != nil {
panic(err)
}
//查询关联订单数
count := db.Model(&User{Id: 2}).Association("Orders").Count()
log.Println("count:", count)
//查询用户的订单所购买的商品
var orders []Order
var goods []Good
err = db.Model(&User{Id: 2}).Association("Orders").Find(&orders)
if err != nil {
panic(err)
}
err = db.Model(&orders).Association("Goods").Find(&goods)
if err != nil {
panic(err)
}
log.Println("orders:", orders)
log.Println("goods:", goods)
//删除关联
db.Select("Orders", "Goods").Delete(&User{Id: 6})
db.Select(clause.Associations).Delete(&User{Id: 7})
}
//输出:
//count: 2
//orders: [{2 1664 1653532944 [] 2} {3 1664 1653533385 [] 2}]
//goods: [{2 雪梨 128 2} {3 雪梨 128 3}]
数据表展示
-- auto-generated definition
create table users
(
id integer
primary key,
name text,
address text,
phone text
);
-- auto-generated definition
create table orders
(
id integer
primary key,
amount integer,
create_at integer,
user_id integer
constraint fk_users_orders
references users
);
-- auto-generated definition
create table goods
(
id integer
primary key,
name text,
price integer,
order_id integer
constraint fk_orders_goods
references orders
);
Orm关联的设计提供了对关联模型的操作手段,对于关联模型的数据迁移和关联模型数据操作的一致性是需要用户去保证的
文档参考
Gorm关联 https://gorm.io/zh_CN/docs/belongs_to.html