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