一对一,一对多,多对多

一对一操作

一、增加

user_profile := relate_tables.UserProfile{
Pic:"1.jpg",CPic:"2.jpg",Phone:"xxx",
User:relate_tables.User{Name:"hallen",Age:18,Addr:"xxx"},
}
result := db.Create(&user_profile)

默认是关联创建或更新的
创建/更新时不会保存关联:gorm:"save_associations:false"

二、查询

1.第一种方式:Association

// 先查询出来,在根据Association属性值关联查询,Association的值为关联表的模型名称
var u_profile relate_tables.UserProfile
db.First(&u_profile,1)
fmt.Println(u_profile)
db.Model(&u_profile).Association("User").Find(&u_profile.User)

2.第二种方式:Preload

var u_profile relate_tables.UserProfile
db.Debug().Preload("User").First(&u_profile,1) // 关系名
fmt.Println(u_profile)

3.第三种方式:Related

var user_profile3 relate_tables.UserProfile
db.First(&user_profile3,1)

var user relate_tables.User
db.Model(&user_profile3).Related(&user,"User")

三、更新

// 先关联查询出来,再更新关联表中的字段
var u_profile1 relate_tables.UserProfile

db.Debug().Preload("User").First(&u_profile1,1)
fmt.Println(u_profile1)
db.Model(&u_profile1.User).Update("p_id",2)

四、删除

// 通过主表删除关联表中的
var u_profile2 relate_tables.UserProfile
db.Debug().Preload("User").First(&u_profile2,1)
db.Delete(&u_profile2.User)

一对多操作、

一、增加

user := relate_tables.User2{
Name:"halle",
Age:18,
Addr:"xxx",
Articles:[]relate_tables.Article{{
Title:"标题测试",
Content:"内容测试",
Desc:"描述测试",
},{
Title:"标题测试2",
Content:"内容测试2",
Desc:"描述测试2",
},
},
}

ret := db.Create(&user)

fmt.Println(ret.RowsAffected)
fmt.Println(ret.Error)

二、查询

1.Preload

var user2 relate_tables.User2

db.Preload("Articles").Find(&user2,2) // 关系名
fmt.Println(user2)

2.Association

var user2 relate_tables.User2

db.First(&user2,2)
db.Model(&user2).Association("Articles").Find(&user2.Articles)
fmt.Println(user2)

3.Related

var user2 relate_tables.User2

db.First(&user2,1)

var articles []relate_table.Article

db.Model(&user2).Related(&articles, "Articles") // 关系名称

三、更新

// 先查询
var user2 relate_tables.User2

db.Preload("Articles").Find(&user2,2) // 关系名

// 再更新,更新指定条件,不然会把所有满足条件的都更新

db.Model(&user2.Articles).Where("title=? and uid=?","标题测试2",2).Update("uid",3) // name和uid限制条件

// update只能更新一个字段,如果想同时更新多个字段,使用save,后面会讲

四、删除

// 先查询
var user2 relate_tables.User2
db.Preload("Articles").Find(&user2,2) // 关系名



// 再删除,删除要指定条件,不然会把所有满足条件的都删除
db.Delete(&user2.Articles,"title=? and uid=?","标题测试3",3)

// 或者使用where
db.Where("title=? and uid=?","标题测试3",3).Delete(&user2.Articles)

多对多操作

一、增加

// 一篇文章有多个帖子
article := relate_tables.Article2{
Title:"测试多对多标题1",
Content:"测试多对多内容1",
Desc:"测试多对多描述1",
Tags:[]relate_tables.Tag{{
Name:"django",
Desc:"django标签",
},
{
Name:"python",
Desc:"python标签",
},
},
}



ret := db.Create(&article)
fmt.Println(ret.Error)

或者先插入单表的,再关联插入

tag := relate_tables.Tag{Name:"beego2",Desc:"beego2标签"}
db.Create(&tag)

article := relate_tables.Article2{
Title:"测试多对多标题4",
Content:"测试多对多内容5",
Desc:"测试多对多描述5",
Tags:[]relate_tables.Tag{
tag,
},
}

db.Create(&article) // 这里不会重复插入前面create的数据

二、查询

1.Preload

var article relate_tables.Article2

db.Preload("Tags").Find(&article,1)
fmt.Println(article)

2.Association

var article relate_tables.Article2
db.First(&article,1)

db.Model(&article).Association("Tags").Find(&article.Tags)
fmt.Println(article)

3.Related

var article relate_tables.Article2
db.First(&article,1)

var tags []relate_table.Tag

db.Model(&article).Related(&tags, "Tags")

三、更新

// 先查询
var article relate_tables.Article2
db.Preload("Tags").Find(&article,1)

// 再更新,记得加条件
db.Model(&article.Tags).Where("name = ?","beego").Update("name","xxx")

四、删除

// 先查询
var article relate_tables.Article2
db.Preload("Tags").Find(&article,1)

// 再删除,记得加条件
db.Where("name = ?","xxx").Delete(&article.Tags)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值