gorm关联关系

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"net/http"
)

type Class struct {
	// 班级,一个学生有一个班级,一个班级有多个学生
	gorm.Model
	ClassName string    `json:"class_name"`
	Students  []Student `json:"students"` // 一个班级有多个学生,一对多关系
}

type Student struct {
	// 学生
	gorm.Model
	StudentName string `json:"student_name"`
	Class       Class  `json:"class"`
	ClassID     uint   `json:"class_id"` // 一个学生有一个班级,对应一个班级有多个学生,学生通过ClassID来知道是属于哪个班级的
	IDCard      IDCard `json:"id_card"`  // 一个学生对应一个身份证,一对一关系
	// 一个学生有多个老师, 与老师建立多对多的关系
	Teachers []Teacher `gorm:"many2many:student_teacher" json:"teachers"` // 会产生一个关联表
}

type IDCard struct {
	// 身份证
	gorm.Model
	Num       int  `json:"num"`
	StudentID uint `json:"student_id"`
}

type Teacher struct {
	// 老师
	gorm.Model
	TeacherName string `json:"teacher_name"`
	// 一个老师有多个学生,与学生建立多对多的关系
	Students []Student `gorm:"many2many:student_teacher" json:"students"` // 会产生一个关联表
}

func main() {
	db, err := gorm.Open("mysql", "root:leon110...@tcp(10.227.10.172:3306)/cache?charset=utf8&parseTime=True")
	if err != nil {
		panic(err.Error())
	}
	defer db.Close()
	//card := IDCard{
	//	Num: 12345,
	//}
	//s := Student{
	//	StudentName: "alex",
	//	IDCard:      card,
	//	Teachers: []Teacher{t},
	//}
	//
	//t := Teacher{
	//	TeacherName: "qm",
	//	Students: []Student{s},
	//}
	//C := Class{
	//	ClassName: "xueqianban",
	//	Students:  []Student{s}, // 给班级里面添加学生
	//}

	db.AutoMigrate(&IDCard{}, &Teacher{}, &Class{}, &Student{})
	// err = db.Create(&card).Error
	//db.Create(&C)
	//db.Create(&t)
	r := gin.Default()
	r.POST("/student", func(context *gin.Context) {
		var student Student
		_ = context.BindJSON(&student)
		db.Create(&student)
		context.JSON(http.StatusOK, "ok")
	})
	r.GET("/student/:ID", func(context *gin.Context) {
		id := context.Param("ID")
		fmt.Printf("id=%s\n", id)
		var student Student
		_ = context.BindJSON(&student)
		// 预加载
		db.Preload("Teachers").Preload("IDCard").Preload("Class").First(&student, "id = ?", id)
		context.JSON(http.StatusOK, gin.H{
			"data": student,
		})
	})

	r.GET("/class/:ID", func(context *gin.Context) {
		id := context.Param("ID")
		var c Class
		// 嵌套预加载
		db.Preload("Students").Preload("Students.IDCard").Preload("Students.Teachers").First(&c, "id=?", id)
		context.JSON(http.StatusOK, gin.H{
			"data": c,
		})
	})
	r.Run(":8888")
}


posted @ 2020-09-02 21:35  我的胡子有点扎  阅读(319)  评论(0编辑  收藏  举报