无法找到使连接查询结果可在 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
.
我想在叶模板中显示 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
.