如何使用gorm有条件地搜索具有多对多关系的数据

如何使用gorm有条件地搜索具有多对多关系的数据,go,go-gorm,Go,Go Gorm,我正在开发一个使用gorm管理报价的应用程序。 引号有多个标记。 当指定多个标记时,我希望获得包含所有指定标记的引号 这是我的数据模型 type Quote struct { ID uint `gorm:"primary_key" json:"id"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:&qu

我正在开发一个使用gorm管理报价的应用程序。 引号有多个标记。 当指定多个标记时,我希望获得包含所有指定标记的引号

这是我的数据模型

type Quote struct {
    ID        uint      `gorm:"primary_key" json:"id"`
    CreatedAt time.Time `json:"created_at"`
    UpdatedAt time.Time `json:"updated_at"`
    Text      string    `json:"text"`
    Page      uint      `json:"page"`
    ISBN      string    `json:"isbn"`
    Tags      []Tag     `gorm:"many2many:quote_tags;" json:"tags"`
}

type Tag struct {
    ID        uint      `gorm:"primary_key" json:"id"`
    CreatedAt time.Time `json:"created_at"`
    Name      string    `json:"name"`
}
我想做这样的事。语法不正确

db.Preload("Tags").Where(<quotes.tags.name contains all tagNames>).Find(&quotes) // tagNames []string
有没有办法让戈姆做到这一点?
提前感谢您。

在这种情况下,您需要做的是首先找出您需要运行的SQL的外观

要获取与所有给定标记匹配的所有引号,您需要将quotes表连接到一个子查询,该子查询计算每个引号匹配的标记数,如下所示:

选择* 引述 参加 选择quote_id,count*作为count 来自quote_tags qt JOIN tags t ON qt.tag_id=t.id 其中t.name在“tag1”、“tag2”、“tag4”中 按报价单分组\u id 与quote上的匹配_id=quotes.id和matched.count=3 一旦你做到了,你就试着用Gorm说:

requiredTags:=[]字符串{tag1,tag2,tag3} db.preload标签。 加入 在quote_id=quotes.id和matched.count=?,作为匹配的联接?, db.Selectquote\u id,count*作为count。 表QUOTE_标签qt。 JoinsJOIN在qt.tag_id=t.id上标记t。 其中,t.name IN,requiredTags。 集团报价(id), lenrequiredTags, . 查找和引用
请参阅:

我遇到了这个错误。请求失败:sql:转换参数$1类型:不支持的类型gorm.DB,结构[]sql和子查询正常工作,因此我认为将子查询分配给JOIN子句时出现问题。您使用的是哪个版本的gorm?确保它是最新的稳定版本,或者至少>1.20,相当于>2.0I使用的是旧版本的gorm。我从github.com/jinchu/gorm v1.9.16更新到gorm.io/gorm v1.21.9,上述错误消失了。谢谢你的回答!