Golang Gorm 一对多 关联模式 Association + Find 查询关联

查找关联


// 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  []}}]

联表  Association


外键设定

一旦能接受新的模式,就可以说一说外键设定了,两个结构体之间相互关联,最直接的想法是我怎么从一个结构体出发然后去获得另一个结构体。

外键

如果我需要通过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()

你可能感兴趣的:(Golang,Gorm,golang)