相关表格中按条件列出的GORM预加载
我不知道如何正确地编写一个查询,只选择那些条件应用于关系表的条目。 我的多对多模式类似于相关表格中按条件列出的GORM预加载,go,go-gorm,Go,Go Gorm,我不知道如何正确地编写一个查询,只选择那些条件应用于关系表的条目。 我的多对多模式类似于主题-主题帖子-帖子。我想查询所有TopicPosts,其中Post不是私有的或属于当前用户。我是这样做的: topicPosts := []model.TopicPost{} h.DB. Where("topic_id = ?", id). Preload("Post", func(db *gorm.DB) *gorm.DB { return db.Not("is_priva
主题
-主题帖子
-帖子
。我想查询所有TopicPosts
,其中Post
不是私有的或属于当前用户。我是这样做的:
topicPosts := []model.TopicPost{}
h.DB.
Where("topic_id = ?", id).
Preload("Post", func(db *gorm.DB) *gorm.DB {
return db.Not("is_private = ? AND user_id != ?", "true", currentUser.ID)
}).
Preload("Post.Tags").
Find(&topicPosts)
正如预期的那样,它返回所有TopicPosts
,但不急于加载带有给定条件的Posts
。然后,我手动过滤掉它们:
publicTopicPosts := []model.TopicPost{}
for _, p := range topicPosts {
if p.Post.ID != 0 {
publicTopicPosts = append(publicTopicPosts, p)
}
}
我意识到这是一个低于标准的解决方案,我不太擅长使用SQL,但我认为应该可以在单个查询中实现。我将感谢任何帮助。如果有必要,我会使用Postgres。根据我的经验,使用GORM最合适的方法是使用子查询:
topicPosts := []model.TopicPost{}
DB.GetDB().
Where("topic_id = ? AND post_id IN (?)", id,
DB.GetDB().Table("posts").
Select("id").
Not("is_private = ? AND user_id != ?", "true", currentUser.ID)).
SubQuery()).
Preload("Post").
Find(&topicPosts)
根据我的经验,使用GORM最合适的方法是利用子查询:
topicPosts := []model.TopicPost{}
DB.GetDB().
Where("topic_id = ? AND post_id IN (?)", id,
DB.GetDB().Table("posts").
Select("id").
Not("is_private = ? AND user_id != ?", "true", currentUser.ID)).
SubQuery()).
Preload("Post").
Find(&topicPosts)
你可以用这个方法
db.Preload("Post", "is_private = ? AND user_id != ?", "true", currentUser.ID).Find(&topicPosts)
你可以用这个方法
db.Preload("Post", "is_private = ? AND user_id != ?", "true", currentUser.ID).Find(&topicPosts)
在运行查询之前调用
h.DB.Debug().Where…
以查看正在执行的SQL如何?此外,您可能已经执行了此操作,但为了简洁起见没有显示它,但请确保在运行查询时检查.Error
字段,以了解您可以信任所加载内容err:=h.DB.Where()..Find(&dest).Error
在运行查询以查看正在执行的SQL之前调用h.DB.Debug().Where…
如何?此外,为了简洁起见,您可能已经执行了此操作,但请确保在运行查询时检查.Error
字段,要知道你可以信任你加载的内容<代码>错误:=h.DB.Where()…查找(&dest).错误