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

Posted

技术标签:

【中文标题】Vapor Swift - 从两个模型中获取数据【英文标题】:Vapor Swift - Obtaining data from two Models 【发布时间】:2018-12-10 23:07:54 【问题描述】:

我在 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】:

我不确定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 得到适当的结果。

【讨论】:

以上是关于Vapor Swift - 从两个模型中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥从 Psql 通过 Swift (Vapor) 到通过 Ajax 的 JQuery 的日期落后了 31 年?

Swift Vapor 服务器:如何在获取请求中返回嵌套字典?

Vapor Xcode 项目中的两个几乎相同的目标

从 Vapor 3 到 Vapor 4 的 LingoVapor 包

在纯 Swift (Vapor) 项目中拥有 HMAC SHA256

使用不同的数据库提供程序测试 Vapor 3