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

Posted

技术标签:

【中文标题】找不到在 Vapor 3 中使连接查询结果可编码的方法【英文标题】:Cannot find a way to make a joined query result encodable in Vapor 3 【发布时间】:2018-07-25 21:09:07 【问题描述】:

我想在叶子模板中显示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 属性创建为 EncodableStream 将起作用,但这已被删除。如果使用上面的struct,则会出现编译错误:

类型“APContext”不符合协议“Encodable”

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

let personnel = [Person]

然后就可以了。

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

【问题讨论】:

用两个属性而不是元组创建一个struct Personnel 感谢@LeoDabus。我使用了您的建议 - 请参阅我的答案。 【参考方案1】:

多亏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.

【讨论】:

以上是关于找不到在 Vapor 3 中使连接查询结果可编码的方法的主要内容,如果未能解决你的问题,请参考以下文章

制作自定义 404 页面 Vapor 3

Vapor 3 和 Fluent - 嵌套查询

无法在 Vapor 项目中连接我的 MySQL 数据库

MySQL那些你不得不偷偷掌握的知识(昨天有小伙伴问博主,今天来解答啦,谷歌都找不到的干货知识,偷偷收藏吧)

MySQL那些你不得不偷偷掌握的知识(昨天有小伙伴问博主,今天来解答啦,谷歌都找不到的干货知识,偷偷收藏吧)

Vapor:如何协调多个请求,直到完成一个中心请求