问题描述
我想从数据库中查询所有用户朋友的帖子。我已经制定了以下代码,该代码似乎可以正常工作,但看起来效果并不理想,尤其是我过滤包含用户ID的帖子的部分。
user.$friends
.query(on: request.db)
.all()
.flatMap { (friends: Array<User>) -> EventLoopFuture<Page<Post>> in
return Post
.query(on: request.db)
.filter(\.$user.$id ~~ friends.reduce(into: [],{ (ids: inout Set<UUID>,user: User) in
if let id: UUID = user.id {
ids.insert(id)
}
}))
.sort(\.$createdAt)
.paginate(for: request)
}
如何清除此代码?
解决方法
我没有机会进行测试,但这看起来是正确的:
return user.$friends
.query(on: request.db)
.all()
.flatMap { (friends: Array<User>) -> EventLoopFuture<Page<Post>> in
return friends.map { friend in
return Post
.query(on: request.db)
.filter(\.$user.$id == friend).all()
}.flatten(on: request.eventLoop)
.sort(\.$createdAt)
.paginate(for: request)
}
查询返回的是Posts数组,因此在对其进行排序和分页之前,需要将其展平。