// User 拥有并属于多种 language,`user_languages` 是连接表
type User struct {
gorm.Model
Languages []Language `gorm:"many2many:user_languages;"`
}
type Language struct {
gorm.Model
Name string
}
查找所有匹配的关联记录
db.Model(&user).Association("Languages").Find(&languages)
查找带条件的关联
codes := []string{"zh-CN", "en-US", "ja-JP"}
db.Model(&user).Where("code IN ?", codes).Association("Languages").Find(&languages)
db.Model(&user).Where("code IN ?", codes).Order("code desc").Association("Languages").Find(&languages)
------------------------------------------------------------------------------------------------------------------------------
使用 Association 方法, 需要把 User 查询好, 然后根据 User 定义中指定AssociationForeignKey 去查找CreditCard。
查询某条数据使用first 查询唯一值
u := &User{Id: 1}
db.Debug().First(u)
fmt.Println(u)
db.Where("id=?",u.Id).First(u)
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
gorm.Model
UserName string `json:"username" gorm:"column:username"`
CreditCards []CreditCard `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}
type CreditCard struct {
gorm.Model
Number string
UserID int
}
func main() {
dsn6 := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
db, _ := gorm.Open(mysql.Open(dsn6), &gorm.Config{})
db.AutoMigrate(&User{}, &CreditCard{})
//查找 用户名为 lucas 的所有信用卡信息
u1 := &User{UserName: "lucas"}
//Association必须要先查出User才能关联查询对应的CreditCard
db.First(u1)
db.Model(u1).Association("CreditCards").Find(&u1.CreditCards)
fmt.Println(u1)
}
这里只查找了creditcard
[1.513ms] [rows:2] SELECT * FROM `credit_cards` WHERE `credit_cards`.`user_id` = 1 AND `credit_cards`.`deleted_at` IS NULL
associate是先去获取user,再去获取creditcard !!!!!!!!! var u User db.Debug().Where("name = ?", "lucas").Find(&u) fmt.Println(u) [2.756ms] [rows:1] SELECT * FROM `user` WHERE name = 'lucas' {1 lucas []}// 关联查询的结果,保存到user.CreditCard属性 db.Debug().Model(&u).Association("Articles").Find(&u.Articles) fmt.Println(u) [0.712ms] [rows:2] SELECT * FROM `article` WHERE `article`.`user_id` = 1 {1 lucas [{1 k8s 1 {0 []}} {2 golang 1 {0 []}}]}
a := make([]Article, 10)
var u User
db.Take(&u, 3)
db.Model(&u).Association("Articles").Find(&a)
fmt.Println(u)
fmt.Println(a)
{3 lucas []}
[{4 golang 3 {0 []}} {5 k8s 3 {0 []}}]
外键设定
一旦能接受新的模式,就可以说一说外键设定了,两个结构体之间相互关联,最直接的想法是我怎么从一个结构体出发然后去获得另一个结构体。
外键
如果我需要通过User去查找它拥有哪些CreditCard, 那么实际上我做的事情 = "拿着User主键去CreditCard表查询".
一旦理解外键是怎么设置的, 我们就可以开始用上外键了, 概念:Association
是一个笼统的工具, 用于管理所有关联关系,以上面的Card&User为例,,我们来管理以上两表之间的关联关系(上面两表,采用默认外键/主键的方式相互关联)
cs := []CreditCard{}
xiaohan := &User{
Model:gorm.Model{
ID:1,
},
}
// 所有与xiaohan(id=1)相关联的CreditCard,找出来
d.Model(xiaohan).Association("CreditCards").Find(&cs)
// xiaohan数据取消与ID=1的CreditCard取消关联
d.Model(xiaohan).Association("CreditCards").Delete(&CreditCard{
Model:gorm.Model{
ID:1,
},
})
model 先拿到这张表,然后去连接tags第三张表。之后就是最关键的要去执行什么操作,这个操作可以是delete clean append
// xiaohan与CreditCard之间添加关联
d.Model(xiaohan).Association("Languages").Append(&cards)// 取消所有关联
db.Model(xiaohan).Association("Languages").Clear()// 对象关联计数
db.Model(xiaohan).Association("Languages").Count()