无法找到一种方法来使联合查询结果在Vapor 3中可编码

时间:2018-07-25 21:09:07

标签: swift vapor

我想在叶模板中显示text = cur.fetchone()[0]查询的结果(调试显示正在工作):

join

我无法找到一种将上下文直接作为数组传递的方法(例如在Vapor 2中)。因此,我正在尝试使用可编码结构:

persons.get("/persons")
{ request ->Future<View> in
    return Title.query(on:request).join(\Person.titleId, to:\Title.id)
                .alsoDecode(Person.self).all().flatMap(to: View.self)  { pers in
        let context = APContext(title: "Demo", personnel: pers)
        let leaf = try request.make(LeafRenderer.self)
        return leaf.render("persons", context)
    }
}

documentation已过时,因为它建议创建struct APContext: Encodable { let title: String let personnel: [(Title,Person)] } 属性,因为personnel可以工作,但是已将其删除。如果使用上面的EncodableStream,则会产生编译错误:

  

类型“ APContext”不符合协议“可编码”

如果我简化查询,则定义变为:

struct

然后它起作用。

因此,我想我的问题可以归结为:如何使let personnel = [Person] 可编码?

1 个答案:

答案 0 :(得分:0)

由于狮子座的建议,我有了一个解决方案:

struct Personnel: Encodable {
    let title: Title
    let person: Person
}

并在路由中包括以下内容:

var enc: [Personnel] = []
for per in pers {
    enc.append(Personnel(title:per.1,person:per.0))
}

enc现在可以愉快地传递到叶子模板。唯一需要注意的是,标记必须包含personnel结构中的字段名称,例如per.person.surname