vapor - 使用 alsodecode() 从 mysql 获取数据
vapor - Obtaining data from mysql using alsodecode()
我正在尝试从 mysql 数据库获取数据,并使用函数 alsodecode() 连接我的两个表(usuarios 和 colegios)。
我的代码如下所示:
func usuariosHandler(_ req: Request) throws -> Future<View> {
return Usuario.query(on: req).join(\Colegio.id, to: \Usuario.colegioId).alsoDecode(Colegio.self).all().flatMap(to: View.self) { usuarios in
let contexto = UsuariosContext(title: "Usuarios de la aplicación", usuarios: usuarios)
return try req.view().render("usuarios", contexto)
}
}
问题是查询的结果是一个元组,我必须通过叶将其发送到视图。此外,这是编译器的错误:无法将类型“[(Usuario, Colegio)]”的值转换为预期的参数类型“[Usuario]”
我是 Swift 和 Vapor 的初学者。有人可以帮我吗?
谢谢!
您需要使用 Encodable
结构来传递元组 - 一种结构用于保存元组数据,另一种用于上下文:
struct MyTuple: Encodable {
let name: String // put the fields from the join in here
}
struct MyContext Encodable {
let title: String
let usuarios: [MyTuple]
}
Then modify your route to create the data structure to pass as the context:
func usuariosHandler(_ req: Request) throws -> Future<View> {
return Usuario.query(on: req).join(\Colegio.id, to: \Usuario.colegioId).alsoDecode(Colegio.self).all().flatMap(to: View.self) { usuarios in
var usuariosTuples: [MyTuple] = []
for usuario in usuarios {
usuariosTuples.append( MyTuple( usuario.0 ) )
}
let contexto = UsuariosContext(title: "Usuarios de la aplicación", usuarios: usuariosTuples)
return try req.view().render("usuarios", contexto)
}
}
我假设第一个字段是 string
。
我正在尝试从 mysql 数据库获取数据,并使用函数 alsodecode() 连接我的两个表(usuarios 和 colegios)。
我的代码如下所示:
func usuariosHandler(_ req: Request) throws -> Future<View> {
return Usuario.query(on: req).join(\Colegio.id, to: \Usuario.colegioId).alsoDecode(Colegio.self).all().flatMap(to: View.self) { usuarios in
let contexto = UsuariosContext(title: "Usuarios de la aplicación", usuarios: usuarios)
return try req.view().render("usuarios", contexto)
}
}
问题是查询的结果是一个元组,我必须通过叶将其发送到视图。此外,这是编译器的错误:无法将类型“[(Usuario, Colegio)]”的值转换为预期的参数类型“[Usuario]”
我是 Swift 和 Vapor 的初学者。有人可以帮我吗?
谢谢!
您需要使用 Encodable
结构来传递元组 - 一种结构用于保存元组数据,另一种用于上下文:
struct MyTuple: Encodable {
let name: String // put the fields from the join in here
}
struct MyContext Encodable {
let title: String
let usuarios: [MyTuple]
}
Then modify your route to create the data structure to pass as the context:
func usuariosHandler(_ req: Request) throws -> Future<View> {
return Usuario.query(on: req).join(\Colegio.id, to: \Usuario.colegioId).alsoDecode(Colegio.self).all().flatMap(to: View.self) { usuarios in
var usuariosTuples: [MyTuple] = []
for usuario in usuarios {
usuariosTuples.append( MyTuple( usuario.0 ) )
}
let contexto = UsuariosContext(title: "Usuarios de la aplicación", usuarios: usuariosTuples)
return try req.view().render("usuarios", contexto)
}
}
我假设第一个字段是 string
。