Files
learn-golang/Web开发/03go-gorm-demo/relation_many_to_many.go
liumangmang b010f82221 feat(auth): 添加完整的用户认证API项目
- 实现用户注册、登录、JWT令牌认证功能
- 集成Gin、GORM、Viper、Zap等框架
- 添加密码加密、数据库操作、中间件等完整功能
- 配置多环境支持、日志轮转、CORS处理
- 创建完整的项目结构和配置文件体系
2025-12-30 18:00:42 +08:00

97 lines
2.3 KiB
Go

package main
import (
"fmt"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
// 学生和课程:多对多关系
type Student struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
Courses []Course `gorm:"many2many:student_courses;"` // 多对多
}
type Course struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
Students []Student `gorm:"many2many:student_courses;"` // 多对多
}
func main() {
db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
//db.AutoMigrate(&Student{}, &Course{})
// 1. 创建课程
//math := Course{Name: "Math"}
//physics := Course{Name: "Physics"}
//chemistry := Course{Name: "Chemistry"}
//db.Create(&math)
//db.Create(&physics)
//db.Create(&chemistry)
// 2. 创建学生并关联课程
//alice := Student{
// Name: "Alice",
// Courses: []Course{math, physics},
//}
//bob := Student{
// Name: "Bob",
// Courses: []Course{physics, chemistry},
//}
//db.Create(&alice)
//db.Create(&bob)
//fmt.Println("Students and courses created")
//查询数据库的alice的学生
var alice Student
db.Where("name = ?", "Alice").First(&alice)
//查询数据库的Bob学生
var bob Student
db.Where("name = ?", "Bob").First(&bob)
//查询课程
var math Course
db.Where("name = ?", "Math").First(&math)
//// 5. 添加关联
//db.Model(&alice).Association("Courses").Append(&chemistry)
//fmt.Println("Alice enrolled in Chemistry")
//// 7. 替换所有关联
//db.Model(&alice).Association("Courses").Replace(&math)
//fmt.Println("Alice now only takes Math")
// 8. 清空关联
db.Model(&bob).Association("Courses").Clear()
fmt.Println("Bob dropped all courses")
// 3. 查询学生的课程
var student1 Student
db.Preload("Courses").First(&student1, 1)
fmt.Printf("%s's courses:\n", student1.Name)
for _, course := range student1.Courses {
fmt.Printf(" - %s\n", course.Name)
}
// 4. 查询课程的学生
var course1 Course
db.Preload("Students").First(&course1, 1)
fmt.Printf("%s course students:\n", course1.Name)
for _, student := range course1.Students {
fmt.Printf(" - %s\n", student.Name)
}
//查询bob的课程
var student2 Student
db.Preload("Courses").First(&student2, 2)
fmt.Printf("%s's courses:\n", student2.Name)
for _, course := range student2.Courses {
fmt.Printf(" - %s\n", course.Name)
}
}