首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用gorm有条件地搜索具有多对多关系的数据

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

Stack Overflow用户
提问于 2021-05-05 11:05:29
回答 1查看 82关注 0票数 0

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

这是我的数据模型。

代码语言:javascript
运行
复制
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"`
}

我想做这样的事情。(语法不正确)

代码语言:javascript
运行
复制
db.Preload("Tags").Where(<quotes.tags.name contains all tagNames>).Find(&quotes) // tagNames []string

有没有办法用gorm做到这一点?提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-05 23:40:07

在这种情况下,您必须首先找出需要运行的SQL是什么样子。

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

代码语言:javascript
运行
复制
SELECT * 
FROM quotes 
JOIN (
   SELECT quote_id, count(*) AS count
   FROM quote_tags qt JOIN tags t ON qt.tag_id = t.id
   WHERE t.name IN ('tag1', 'tag2', 'tag4')
   GROUP BY quote_id
) AS matched ON quote_id = quotes.id AND matched.count = 3

一旦你有了它,你可以试着在Gorm中这样说:

代码语言:javascript
运行
复制
requiredTags := []string{"tag1", "tag2", "tag3"}
db.Preload("Tags").
    Joins(
        "JOIN (?) AS matched ON quote_id = quotes.id AND matched.count = ?",
        db.Select("quote_id, count(*) AS count").
            Table("quote_tags qt").
            Joins("JOIN tags t ON qt.tag_id = t.id").
            Where("t.name IN (?)", requiredTags).
            Group("quote_id"),
        len(requiredTags),
    ).
    Find(&quotes)

请参阅:GORM Advanced Query/From Subquery

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67394663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档