Gorm中没有belong many怎么办?

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

背景

最近项目开发过程中遇到了一个问题有两个结构体试题和考题试题没有分数考题拥有分数试题可以被多次选中充当考题每次充当考题的时候都会有一个分数。对于一个试题来时第一次被选中充当考题是两分第二次可能就变成了五分。

具体问题

思考一下试题和考题是什么关系看下方结构体

//这是一道考试题
type SinglePaperQuestion struct {
    global.GVA_MODEL
    SingleQuestion          ExamQuestion //考题包含一道试题
    Score                   int `json:"score"` //然后加上分数
}
//这是一道试题
type ExamQuestion struct {
    global.GVA_MODEL
    QuestionBankID   uint                 `json:"questionBankID" gorm:"comment:所属的题库ID"` // 所属题库id
    QuestionBankName string               `json:"questionBankName" gorm:"所属的题库名称"`       // 所属的题库名称
    Chapter          int                  `json:"chapter" gorm:"comment:所属的章节id"`        // 所属章节
    Level            int                  `json:"level" gorm:"comment:难度等级"`             // 难度等级
    QuType           int                  `json:"quType" gorm:"comment:试题类型"`            // 试题类型
    ChapterName      string               `json:"chapterName" gorm:"章节名称"`               // 章节名称
    Content          string               `json:"content" gorm:"试题内容"`                   // 试题内容
    Analysis         string               `json:"analysis" gorm:"comment:试题解析"`          // 试题解析
    AnswerList       []ExamQuestionAnswer `json:"answerList"`                            // 答案列表
    SubQuestionList  []ExamSubQuestion    `json:"subQuestionList"`                       // 组合题子题目
    //ExamPapers       []ExamPaper          `json:"examPaper" gorm:"comment:试题所属试卷;many2many:paper_questions;"`
}

最初我是这样想的一个考题包含一道试题一个试题可以属于多道考题仔细思考了一下这不是hasOne的关系如果是hasOne的话一道考题拥有一道试题那个这道试题就会打上SingleQuestionID ,一旦试题打上了SingleQuesionID那么这道试题就只能被选中一次充当考题没法办使用第二次了。 所以这种情况属于belong many 这在gorm中是无法表示的。

具体解决

方法一使用many2many来表示belong many 未解决

既然无法使用belong many 那我使用many2many来表示看下方结构体

//这是一道考试题
type SinglePaperQuestion struct {
    global.GVA_MODEL
    SingleQuestion          []ExamQuestion  `gorm:"many2many:singleQu_singlePaperQu"` //想要使用many2many必须要使用切片
    Score                   int `json:"score"` //然后加上分数
}
//这是一道试题
type ExamQuestion struct {
    global.GVA_MODEL
    QuestionBankID   uint                 `json:"questionBankID" gorm:"comment:所属的题库ID"` // 所属题库id
    QuestionBankName string               `json:"questionBankName" gorm:"所属的题库名称"`       // 所属的题库名称
    Chapter          int                  `json:"chapter" gorm:"comment:所属的章节id"`        // 所属章节
    Level            int                  `json:"level" gorm:"comment:难度等级"`             // 难度等级
    QuType           int                  `json:"quType" gorm:"comment:试题类型"`            // 试题类型
    ChapterName      string               `json:"chapterName" gorm:"章节名称"`               // 章节名称
    Content          string               `json:"content" gorm:"试题内容"`                   // 试题内容
    Analysis         string               `json:"analysis" gorm:"comment:试题解析"`          // 试题解析
    AnswerList       []ExamQuestionAnswer `json:"answerList"`                            // 答案列表
    SubQuestionList  []ExamSubQuestion    `json:"subQuestionList"`                       // 组合题子题目
    //ExamPapers       []ExamPaper          `json:"examPaper" gorm:"comment:试题所属试卷;many2many:paper_questions;"`
}

这样貌似是可以了但是我总觉得不符合正常的逻辑明明考题里面只有一道试题我却要用一个切片来存储我觉得这样可能会影响后面的代码逻辑所以放弃了这种用法至于这种方法到底行不行我觉得是可以的只是不符合逻辑用着有些别扭。

方法二使用belong to

我在思考不止我一个人会有这种belong many的使用场景其他人肯定也会遇到甚至gorm作者本身肯定也知道有这种情况的存在那为什么没有belong many 的用法

一定是我的逻辑有问题我的思路不够完善于是我绞尽脑汁去思考。

我能不能在SinglePaperQuestion 中只放一个 ExamQuestionId到时候我用id来获取到具体的试题。但是我又一想这样不符合gorm的关系逻辑呀

灵光一动考题是可以属于试题这样就是belong to关系了在belong to关系中A属于BB是不用做出任何改变的。 这样就转化成了考题属于试题试题没有任何变化多个考题可以使用同一个试题多个考题属于同一个试题。 于是结构体如下

type SinglePaperQuestion struct {
    global.GVA_MODEL
    SingleQuestionID        uint
    SingleQuestion          ExamQuestion
    Score                   int `json:"score"`
}

type ExamQuestion struct {
    global.GVA_MODEL
    QuestionBankID   uint                 `json:"questionBankID" gorm:"comment:所属的题库ID"` // 所属题库id
    QuestionBankName string               `json:"questionBankName" gorm:"所属的题库名称"`       // 所属的题库名称
    Chapter          int                  `json:"chapter" gorm:"comment:所属的章节id"`        // 所属章节
    Level            int                  `json:"level" gorm:"comment:难度等级"`             // 难度等级
    QuType           int                  `json:"quType" gorm:"comment:试题类型"`            // 试题类型
    ChapterName      string               `json:"chapterName" gorm:"章节名称"`               // 章节名称
    Content          string               `json:"content" gorm:"试题内容"`                   // 试题内容
    Analysis         string               `json:"analysis" gorm:"comment:试题解析"`          // 试题解析
    AnswerList       []ExamQuestionAnswer `json:"answerList"`                            // 答案列表
    SubQuestionList  []ExamSubQuestion    `json:"subQuestionList"`                       // 组合题子题目
    //ExamPapers       []ExamPaper          `json:"examPaper" gorm:"comment:试题所属试卷;many2many:paper_questions;"`
}

好了这样belong many就转化成了belong to。

这篇博客写完的时候我在想这种思路对不对一定是考题拥有试题试题属于考题吗 能不能让试题拥有考题考题属于试题这样的话就变成了 has many的模式一个试题拥有多个考题一个考题只能属于一个试题这样应该也是可以的。实现一下具体的结构体

type SinglePaperQuestion struct {
    global.GVA_MODEL
    SingleQuestionID        uint //考题属于一个试题
    Score                   int `json:"score"`
}

type ExamQuestion struct {
    global.GVA_MODEL
    QuestionBankID   uint                 `json:"questionBankID" gorm:"comment:所属的题库ID"` // 所属题库id
    QuestionBankName string               `json:"questionBankName" gorm:"所属的题库名称"`       // 所属的题库名称
    Chapter          int                  `json:"chapter" gorm:"comment:所属的章节id"`        // 所属章节
    Level            int                  `json:"level" gorm:"comment:难度等级"`             // 难度等级
    QuType           int                  `json:"quType" gorm:"comment:试题类型"`            // 试题类型
    ChapterName      string               `json:"chapterName" gorm:"章节名称"`               // 章节名称
    Content          string               `json:"content" gorm:"试题内容"`                   // 试题内容
    Analysis         string               `json:"analysis" gorm:"comment:试题解析"`          // 试题解析
    AnswerList       []ExamQuestionAnswer `json:"answerList"`                            // 答案列表
    SubQuestionList  []ExamSubQuestion    `json:"subQuestionList"`                       // 组合题子题目
    SinglePaperQuestions []SinglePaperQuestion  //试题拥有多个考题
}

belong to之前没有用过这次先使用belong to 进行尝试后续会更新两种用法孰优孰劣。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go