Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相关表格中按条件列出的GORM预加载_Go_Go Gorm - Fatal编程技术网

相关表格中按条件列出的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).错误