我正在开发一个使用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("es) // tagNames []string
有没有办法用gorm做到这一点?提前谢谢你。
发布于 2021-05-05 15:40:07
在这种情况下,您必须首先找出需要运行的SQL是什么样子。
为了获得与所有给定标记匹配的所有引号,您需要将引用表连接到一个子查询,该子查询计算每个引号匹配的标记数,如下所示:
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中这样说:
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("es)
https://stackoverflow.com/questions/67394663
复制