Vapor Swift - Получение данных от двух моделей - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть следующая функция на Vapor:

func getPartidosHandler(_ req: Request) throws -> Future<[PartidoWSData]> {
    return Partido.query(on: req).filter(\.estado == nil).all().map(to: [PartidoWSData].self) { partidos in
        var partidosWS: [PartidoWSData] = []
        for partido in partidos {

            // Something here

        }
        return partidosWS
    }
}

И следующая структура PartidoWSData:

struct PartidoWSData: Content {
    let idPartido: String
    let fecha: String
    let sede1: Future<Sede>
    let sede2: Future<Sede>
}

Моя модель Partido имеет две ссылки на Sede, "sede1" и "sede2».

То, что я хочу, - это чтобы массив выдавал массив структуры PartidoWSData, где я могу видеть два свойства "Partido", "idPartido" и "fecha" и два Sede, относящиеся к модели.

Как я могу это сделать?

Спасибо!

1 Ответ

0 голосов
/ 12 декабря 2018

Я не уверен, какой именно тип связи существует между Partido и Sede, потому что модель здесь не включена, но, предполагая, что это отношение Родитель / Дитя, вы должны иметь возможность сделать что-то вроде:

func getPartidosHandler(_ req: Request) throws -> Future<[PartidoWSData]> {
    return Partido.query(on: req).filter(\.estado == nil).all().flatMap { partidos -> Future<[PartidoWSData]> in
        let partidoIDs = try partidos.map { try $0.requireID() }
        return Sede.query(on: req).filter(\.partidoID ~~ partidoIDs).map { sedes -> [PartidoWSData] in
            return partidos.map { partido -> PartidoWSData in
                return PartidoWSData(
                    id: partido.id
                    sedes: sedes.filter { $0.partidoID == partido.id }
                )
            }
        }
    }
}

Ключ использует оператор ~~ для выполнения предиката x IN (...), а затем с помощью Array.filter для получения соответствующих результатов.

...