GORM Preload по условию в связанной таблице - PullRequest
0 голосов
/ 19 января 2019

Я не могу понять, как правильно написать запрос, который будет выбирать только те записи, где условие применяется к таблице отношений. Моя схема «многие ко многим» выглядит следующим образом Topics - TopicPosts - Posts. Я хочу запросить все 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, если это имеет значение.

...