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