GORM中的many2many關聯關係維護

數據模型如下:


// BaseModel 基礎模型
type BaseModel struct {
	ID        string `gorm:"primaryKey;size:36;"`
	CreatedAt time.Time
	UpdatedAt time.Time
	DeletedAt gorm.DeletedAt `gorm:"index"`
}

func (b *BaseModel) BeforeCreate(db *gorm.DB) error {
	b.ID = uuid.NewString()
	return nil
}

type Student struct {
	BaseModel

	Name   string
	Age    uint
	Gender uint

	Teachers []*Teacher `gorm:"many2many:stu-tea-relation;"`
}

type Teacher struct {
	BaseModel

	Name   string
	Age    uint
	Gender uint

	Students []*Student `gorm:"many2many:stu-tea-relation;"`
}

測試用例如下,並在測試代碼後貼了執行後的SQL語句

func TestSave(t *testing.T) {
	db := dbtools.DB()
	zhangsan := Student{
		Name:   "張三",
		Gender: 1,
		Age:    18,
		Teachers: []*Teacher{
			{
				Name:   "項羽",
				Age:    38,
				Gender: 1,
			},
		},
	}
	db.Create(&zhangsan)
	// INSERT INTO `teacher` (`id`,`created_at`,`updated_at`,`deleted_at`,`name`,`age`,`gender`) VALUES ('a16773d3-ec58-424a-a814-a75a9c7b760a','2022-01-15 09:40:56.886','2022-01-15 09:40:56.886',NULL,'項羽',38,1) ON DUPLICATE KEY UPDATE `id`=`id`
	// INSERT INTO `student` (`id`,`created_at`,`updated_at`,`deleted_at`,`name`,`age`,`gender`) VALUES ('410b1112-80b1-48cb-98bd-a9291975b102','2022-01-15 09:40:56.883','2022-01-15 09:40:56.883',NULL,'張三',18,1)
	// INSERT INTO `stu-tea-relation` (`student_id`,`teacher_id`) VALUES ('410b1112-80b1-48cb-98bd-a9291975b102','a16773d3-ec58-424a-a814-a75a9c7b760a') ON DUPLICATE KEY UPDATE `student_id`=`student_id`
}

func TestQuery(t *testing.T) {
	zhangsan := Student{}
	zhangsan.ID = "410b1112-80b1-48cb-98bd-a9291975b102"
	xiangyu := &Teacher{}
	db := dbtools.DB()
	db.Model(&zhangsan).Association("Teachers").Find(&xiangyu)
	// SELECT `teacher`.`id`,`teacher`.`created_at`,`teacher`.`updated_at`,`teacher`.`deleted_at`,`teacher`.`name`,`teacher`.`age`,`teacher`.`gender` FROM `teacher` JOIN `stu-tea-relation` ON `stu-tea-relation`.`teacher_id` = `teacher`.`id` AND `stu-tea-relation`.`student_id` = '410b1112-80b1-48cb-98bd-a9291975b102' WHERE `teacher`.`deleted_at` IS NULL
	t.Logf("%+v", xiangyu)
}

func TestAppend(t *testing.T) {
	zhangsan := Student{}
	zhangsan.ID = "410b1112-80b1-48cb-98bd-a9291975b102"
	zhangfei := Teacher{
		Name:   "張飛",
		Age:    36,
		Gender: 1,
	}
	db := dbtools.DB()
	err := db.Model(&zhangsan).Association("Teachers").Append(&zhangfei)
	// INSERT INTO `teacher` (`id`,`created_at`,`updated_at`,`deleted_at`,`name`,`age`,`gender`) VALUES ('067d1929-0e19-4f06-9af1-463217a35367','2022-01-15 10:00:46.225','2022-01-15 10:00:46.225',NULL,'張飛',36,1) ON DUPLICATE KEY UPDATE `id`=`id`
	// INSERT INTO `stu-tea-relation` (`student_id`,`teacher_id`) VALUES ('410b1112-80b1-48cb-98bd-a9291975b102','067d1929-0e19-4f06-9af1-463217a35367') ON DUPLICATE KEY UPDATE `student_id`=`student_id`
	if err != nil {
		t.Error(err)
	}
}

func TestReplace(t *testing.T) {
	zhangsan := Student{}
	zhangsan.ID = "410b1112-80b1-48cb-98bd-a9291975b102"
	db := dbtools.DB()
	db.Model(&zhangsan).Association("Teachers").Replace([]Teacher{
		{Name: "曹操", Age: 56, Gender: 1},
		{Name: "夏侯惇", Age: 46, Gender: 1},
	})
	// INSERT INTO `teacher` (`id`,`created_at`,`updated_at`,`deleted_at`,`name`,`age`,`gender`) VALUES ('d18661f9-5c63-4f15-bb11-5febe312af45','2022-01-15 10:03:51.048','2022-01-15 10:03:51.048',NULL,'曹操',56,1),('c0b8688d-51f0-4962-9893-be03e6625b0c','2022-01-15 10:03:51.048','2022-01-15 10:03:51.048',NULL,'夏侯惇',46,1) ON DUPLICATE KEY UPDATE `id`=`id`
	// INSERT INTO `stu-tea-relation` (`student_id`,`teacher_id`) VALUES ('410b1112-80b1-48cb-98bd-a9291975b102','d18661f9-5c63-4f15-bb11-5febe312af45'),('410b1112-80b1-48cb-98bd-a9291975b102','c0b8688d-51f0-4962-9893-be03e6625b0c') ON DUPLICATE KEY UPDATE `student_id`=`student_id`
	// UPDATE `student` SET `updated_at`='2022-01-15 10:03:51.044' WHERE `id` = '410b1112-80b1-48cb-98bd-a9291975b102'
	// DELETE FROM `stu-tea-relation` WHERE `stu-tea-relation`.`student_id` = '410b1112-80b1-48cb-98bd-a9291975b102' AND `stu-tea-relation`.`teacher_id` NOT IN ('d18661f9-5c63-4f15-bb11-5febe312af45','c0b8688d-51f0-4962-9893-be03e6625b0c')
}

關聯關係的前提是:原模型的主鍵不能爲空。

測試代碼中的原模型就是zhangsan,每個case中都設置了主鍵ID值,然後再進行關聯關係操作就沒問題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章