mysql - 在 Vapor 中将多个连接与过滤器结合起来

标签 mysql swift join vapor

在我的后端,我有 Post 和一个 PostController。帖子可以是 visibleToFriendOnly
GET/posts 中,我想返回允许当前用户查看的所有帖子。
User 模型有一个 friends 属性,它是 User, User 的枢轴,列有 userIDfriendID.

我目前收到这样的帖子:

/// /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 (谁是作者)然后查询用户的 friend 并查看当前用户是否在该列表中。
有可行的方法吗?也许加入什么?

最佳答案

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

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)
}

关于mysql - 在 Vapor 中将多个连接与过滤器结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55308678/

相关文章:

php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数 1 是资源

python - 在 Django 中的 commit_on_success block 内调用 transaction.commit()

ios - 自动调整表格 View

ios - 在 Tabbar 内容 ViewController 之前添加登录 View

mysql - SQL 连接查询以返回总和和最近的条目

mysql - 中等规模用户内容网站的数据库类型和引擎

mysql - 即使使用覆盖索引也能优化 COUNT(DISTINCT) 缓慢

尝试使用 FBSDK 快速注销 Facebook 时 iOS 应用程序崩溃

MySQL LEFT OUTER JOIN 与 LIMIT?

database - Zend 2 Framework 中的多对多关系