我对如何查询模型对象的子项并立即使用它感到困惑。我的Client
包含许多Station
个孩子
final class Client: PostgreSQLModel {
var stations: Children<Client, Station> {
return children(\.clientID)
}
}
然后在我的控制器中,我有一个客户列表,我想查看并抓住他们的电台。
func clientIndexHandler(_ req: Request) throws -> Future<View> {
return Client.query(on: req).all().flatMap(to: View.self) { clients in
let sorted = clients.sorted { ... }
let content = try sorted.map { client in
let stations = try client.stations
.query(on: req)
.all()
.map(to: [String].self) { stations in
return stations.map { $0.name }
}
// Now I want to use the stations for other stuff.
return ClientIndexContent(client: client, stations: stations, ....)
}
let context = ClientIndexContext(clients: content)
return try req.make(LeafRenderer.self).render("clients/index", context)
}
}
我的问题是stations
是EventLoopFuture<[String]>
而不是[String]
。由于我在这里使用Leaf,我需要来自客户端和工作站的实际值,以便我可以填充内容以传递到叶子渲染器。
答案 0 :(得分:1)
所以你有很多方法可以做到这一点,但基本上你需要重新思考你在异步世界中做事的方式。然而,Vapor确实提供了一些很好的东西来帮助它。首先,Leaf可以实际处理期货,因此如果您将ClientIndexContext
设置为具有let stations: Future<[String]>
的属性,那么您可以正常访问Leaf内部。
您可以执行的另一个选项是在map(to: [String].self)
上拨打stations
,这将为您获得所有期货。