在 Vapor 中将多个连接与过滤器结合起来
Combine multiple joins with filters in Vapor
在我的后端,我有 Post
和一个 PostController
。 post 可能是 visibleToFriendOnly
.
在 GET /posts
中,我想 return 当前用户允许查看的所有 post。
User
模型有一个 friends
属性,它是 User, User
的主元,列 userID
和 friendID
.
我目前 post 是这样的:
/// /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
并查看当前用户是否在该列表中。
有可行的方法吗?也许加入什么?
看起来您可以像这样构建自定义原始查询
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)
}
在我的后端,我有 Post
和一个 PostController
。 post 可能是 visibleToFriendOnly
.
在 GET /posts
中,我想 return 当前用户允许查看的所有 post。
User
模型有一个 friends
属性,它是 User, User
的主元,列 userID
和 friendID
.
我目前 post 是这样的:
/// /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
并查看当前用户是否在该列表中。
有可行的方法吗?也许加入什么?
看起来您可以像这样构建自定义原始查询
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)
}