GORM关联查询

一对一

conf

appname = beegogorm
httpport = 8080
runmode = dev
mysqladmin="root"
mysqlpwd="123456"
mysqldb="itying"

models

core.go

package models

import (
	"github.com/astaxie/beego"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

var DB *gorm.DB
var err error

func init() {
	mysqladmin := beego.AppConfig.String("mysqladmin")
	mysqlpwd := beego.AppConfig.String("mysqlpwd")
	mysqldb := beego.AppConfig.String("mysqldb")

	//和数据库建立连接
	//  DB, err = gorm.Open("mysql", "root:123456@/beego?charset=utf8&parseTime=True&loc=Local")
	DB, err = gorm.Open("mysql", mysqladmin+":"+mysqlpwd+"@/"+mysqldb+"?charset=utf8&parseTime=True&loc=Local")

	DB.LogMode(true) //开启sql日志

	if err != nil {
		beego.Error()
	}

}

article.go

package models

import (
	_ "github.com/jinzhu/gorm"
)

type Article struct {
	Id          int         `json:"id"`
	Title       string      `json:"title"`
	CateId      string      `json:"cate_id"`
	State       int         `json:"state"`
	ArticleCate ArticleCate `gorm:"foreignkey:Id;association_foreignkey:CateId"`
}

func (Article) TableName() string {
	return "article"
}

多对一/多对一

articleCate.go

package models

import (
	_ "github.com/jinzhu/gorm"
)

type ArticleCate struct {
	Id      int       `json:"id"`
	Title   string    `json:"title"`
	State   int       `json:"state"`
	Article []Article `gorm:"foreignkey:CateId;association_foreignkey:Id"`
}

func (ArticleCate) TableName() string {
	return "article_cate"
}

controllers

package controllers

import (
	"beegogorm/models"

	"github.com/astaxie/beego"
)

type ArticleController struct {
	beego.Controller
}

func (c *ArticleController) Get() {

	//1、查询文章信息
	article := []models.Article{}
	models.DB.Find(&article)

	//2、查询文章信息的时候关联文章分类  (1对1--》文章 对 文章分类)
	article := []models.Article{}
	models.DB.Preload("ArticleCate").Find(&article)

	// 3、查询文章分类信息的时候关联文章  (1对多--》文章分类 对 文章)  
	articleCate := []models.ArticleCate{}
	models.DB.Preload("Article").Find(&articleCate)
	// 一对多和一多一写法一样的
	
	// 4、查询文章分类信息的时候关联文章   条件判断
	articleCate := []models.ArticleCate{}
	models.DB.Preload("Article").Where("id>1").Find(&articleCate)

	articleCate := []models.ArticleCate{}
	models.DB.Preload("Article", "id>3").Where("id>1").Find(&articleCate)

	c.Data["json"] = articleCate
	c.ServeJSON()
}

多对多

一个学生选修多门课程

一个课程也可以被多个学生选修

需要第三张表

models

lesson.go 课程表

package models

import (
	_ "github.com/jinzhu/gorm"
)

type Lesson struct {
	Id      int       `json:"id"`
	Name    string    `json:"name"`
	Student []Student `gorm:"many2many:lesson_student;"`
}

func (Lesson) TableName() string {
	return "lesson"
}

student.go 学生表

package models

import (
	_ "github.com/jinzhu/gorm"
)

type Student struct {
	Id       int
	Number   string
	Password string
	ClassId  int
	Name     string
	Lesson   []Lesson `gorm:"many2many:lesson_student;"`
}

func (Student) TableName() string {
	return "student"
}

lessonStudent.go 关联表

package models

import (
	_ "github.com/jinzhu/gorm"
)

type LessonStudent struct {
	LessonId  int `json:"lesson_id"`
	StudentId int `json:"student_id"`
}

func (LessonStudent) TableName() string {
	return "lesson_student"
}

  

原文地址:https://www.cnblogs.com/yzg-14/p/13418595.html