无法找到使连接查询结果可在 Vapor 3 中编码的方法

Cannot find a way to make a joined query result encodable in Vapor 3

我想在叶模板中显示 join 查询(调试显示正在运行)的结果:

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)
    }
}

我一直没能找到将上下文作为数组直接传递的方法(就像在 Vapor 2 中一样)。所以,我正在尝试使用可编码结构:

struct APContext: Encodable {
    let title: String
    let personnel: [(Title,Person)]
}

documentation 已过时,因为它建议创建 personnel 属性 as EncodableStream 将起作用,但这已被删除。如果使用上面的 struct 则会出现编译错误:

Type 'APContext' does not conform to protocol 'Encodable'

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

let personnel = [Person]

然后就可以了。

所以,我想我的问题可以归结为:如何使 [(Title,Person)] 可编码?

感谢Leo的建议,我有了解决方案:

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.