Vapor Swift-从两个模型中获取数据

时间:2018-12-10 23:07:55

标签: swift 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 :(得分:1)

我不确定PartidoSede之间到底存在哪种类型的关系,因为此处未包含该模型,但是假设它是父子关系,您应该可以像这样:

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获得适当的结果。