蒸气3和Fluent-嵌套查询

时间:2019-12-09 21:41:24

标签: vapor vapor-fluent

我正在尝试在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()
        }
    }
}

2 个答案:

答案 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