在Vapor中将多个连接与过滤器结合使用

问题描述 投票:1回答:1

在我的后端,我有Posts和PostController。帖子可能是visibleToFriendOnly。 在GET /posts中,我想返回当前用户可以看到的所有帖子。 User模型有friends属性,这是User, UseruserIDfriendID列的枢轴。

我目前得到这样的帖子:

/// /posts
func all(req: Request) throws -> Future<[Post]> {
    let authenticated = try req.requireAuthenticated(User.self)
    return Post.query(on: req)
        .filter(\Post.visibleForUserType == authenticated.type)
        // FIXME: respect .visibleForFriendsOnly
        .all()
}

我对此很难,因为对于每个Post,我必须得到userID然后User(谁是作者),然后查询用户的friends并查看当前用户是否在该列表中。 有没有可行的方法呢?也许加入什么?

mysql swift join vapor
1个回答
1
投票

看起来您可以像这样构建自定义原始查询

return req.requestPooledConnection(to: .mysql).flatMap { conn in
    defer { try? req.releasePooledConnection(conn, to: .mysql) }
    return conn.raw("""
    SELECT posts.* FROM posts
    LEFT OUTER JOIN user_friends
        ON (user_friends.userID = posts.userID AND user_friends.friendID = 3)
        OR (user_friends.friendID = posts.userID AND user_friends.userID = 3)
    GROUP BY posts.id
    HAVING COUNT(user_friends.id) = 2 OR posts.userID = 3 OR visibleForFriendsOnly = 0
    """).all(decoding: Post.self)
}
© www.soinside.com 2019 - 2024. All rights reserved.