让我们假设我有以下结构
type Job struct {
ID string `sql:"type:uuid;primary_key;"`
Title string `json:"title,omitempty"`
Skills []*skill.Skill `json:"skills,omitempty"gorm:"many2many:job_skill;"`
}
type Skill struct {
Name string `json:"name" gorm:"primary_key"`
}
查询我做的所有作业:
jobs := &[]Job{}
gorm.DB.Preload("Skills").Find(&jobs)
如何搜索包含某种技能的Job
?我试了下面的,但它说这个列不存在。
s := "golang"
jobs := &[]Job{}
gorm.DB.Preload("Skills").Where("skill = ?", s).Find(&jobs)
我可以看到我的问题,=
似乎不是正确的操作符,因为它需要在列表中搜索。它也没有像我想象的那样加载连接表
pq: column "skill" does not exist
SELECT * FROM "jobs" WHERE skill = 'golang'
Preload
方法和Associations
特性通过基于所创建的关系构造基本SQL查询来帮助您加载字段。诸如加载特定工作(或多个工作)的所有技能之类的查询。但没有比这更复杂的了。
相反,可以将go-gorm
视为构造SQL查询并将数据加载到模型中的一种方法。
考虑到这一点,一个解决方案是使用Joins
来包含skill
表。
gorm.DB.Preload("Skills")
.Joins("INNER JOIN job_skill js ON js.job_id = jobs.id").
.Joins("INNER JOIN skill s ON s.id = js.skill_id").
.Where("s.name = ?", s).Find(&jobs)