在 Fluent+Vapor 中查询 child
Query child in Fluent+Vapor
我对如何查询模型 object 的 children 并立即使用它感到困惑。我的 Client
包含多个 Station
children
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 { [=12=].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,所以我需要来自客户端和站点的实际值,以便我可以填充要传递到叶渲染器的内容。
所以你有很多方法可以做到这一点,但基本上你需要重新考虑你在异步世界中做事的方式。然而,Vapor 确实提供了一些很好的东西来帮助实现这一点。首先,Leaf 实际上可以处理期货,所以如果您将 ClientIndexContext
设置为 let stations: Future<[String]>
的 属性,那么您可以像往常一样在 Leaf 中访问它。
您可以做的另一个选择是在 stations
上调用 map(to: [String].self)
,这将为您获得所有期货。
我对如何查询模型 object 的 children 并立即使用它感到困惑。我的 Client
包含多个 Station
children
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 { [=12=].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,所以我需要来自客户端和站点的实际值,以便我可以填充要传递到叶渲染器的内容。
所以你有很多方法可以做到这一点,但基本上你需要重新考虑你在异步世界中做事的方式。然而,Vapor 确实提供了一些很好的东西来帮助实现这一点。首先,Leaf 实际上可以处理期货,所以如果您将 ClientIndexContext
设置为 let stations: Future<[String]>
的 属性,那么您可以像往常一样在 Leaf 中访问它。
您可以做的另一个选择是在 stations
上调用 map(to: [String].self)
,这将为您获得所有期货。