一对一操作
一、增加
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)