找不到在 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 中使连接查询结果可编码的方法的主要内容,如果未能解决你的问题,请参考以下文章
MySQL那些你不得不偷偷掌握的知识(昨天有小伙伴问博主,今天来解答啦,谷歌都找不到的干货知识,偷偷收藏吧)