如何在多对多字段上进行搜索



让我们假设我有以下结构

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)

相关内容

  • 没有找到相关文章

最新更新