我正在尝试在Vapor 3和Fluent中进行嵌套查询。关键是我需要从每个团队具有特定eventID的每个团队中获取所有用户。团队是事件的孩子。用户是团队的子代。在此先感谢您的帮助。 每个活动只有15个团队,但每个团队12个用户
这是事件模型:
final class Event: Codable {
var id: Int?
var name: String
}
extension Event {
var teams: Children<Event, Team> {
return children(\.eventID)
}
}
这是团队模型
final class Team: Codable {
var id: Int?
var name: String
var icon: String
var eventID: Event.ID
}
extension Team {
var user: Parent<Team, Event> {
return parent(\.eventID)
}
}
extension Team {
var users: Children<Team, User> {
return children(\.teamID)
}
}
这是用户模型。
final class User: Codable {
var id: UUID?
var name: String
var email: String
var eventID: Event.ID
var teamID: Team.ID
}
extension User {
var user: Parent<User, Team> {
return parent(\.teamID)
}
}
我需要发送一个事件ID,并希望它返回所有团队中的所有用户
func getUsersForEvent(_ req: Request) throws -> Future<[User]> {
return try req.parameters.next(Event.self).flatMap(to: [User].self) { event in
return try event.teams.query(on: req).all().flatMap(to: [User].self) { team in
return try team.users.query(on: req).all()
}
}
}
答案 0 :(得分:1)
您可以使用原始SQL查询或SwifQL lib轻松查询该
以下是SwifQL的示例
struct TeamWithUsers: Content {
let id: UUID
let name, icon: String
let users: [User]
}
func getCategoriesWithProducts(_ req: Request) throws -> Future<[TeamWithUsers]> {
return try req.parameters.next(Event.self).flatMap { event in
let usersSubquery = SwifQL
.select(Fn.coalesce(Fn.array_agg(Fn.to_jsonb(User.table)), PgArray() => .jsonbArray))
.from(User.table)
.where(\User.teamID == \Team.id)
let query = try SwifQL
.select(\Team.id, \Team.name, \Team.icon, |usersSubquery | => "users")
.from(Team.table)
.where(\Team.eventID == event.requireID())
// here you could print the raw query for debugging
// print(query.prepare(.psql).plain)
return query.execute(on: req, as: .psql).all(decoding: TeamWithUsers.self)
}
}
答案 1 :(得分:1)
这是我在Ray Wenderlich的帮助下想到的。在我的任务中,我不需要返回所有用户,只需要一次查看一个事件的团队,因此我将eventID作为参数传递。
有关如何根据teamScore对结果进行排序的指南?
WKWebView