在Fluent + Vapor中查询子项

时间:2018-04-24 02:16:16

标签: fluent vapor

我对如何查询模型对象的子项并立即使用它感到困惑。我的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)
    }
}

我的问题是stationsEventLoopFuture<[String]>而不是[String]。由于我在这里使用Leaf,我需要来自客户端和工作站的实际值,以便我可以填充内容以传递到叶子渲染器。

1 个答案:

答案 0 :(得分:1)

所以你有很多方法可以做到这一点,但基本上你需要重新思考你在异步世界中做事的方式。然而,Vapor确实提供了一些很好的东西来帮助它。首先,Leaf可以实际处理期货,因此如果您将ClientIndexContext设置为具有let stations: Future<[String]>的属性,那么您可以正常访问Leaf内部。

您可以执行的另一个选项是在map(to: [String].self)上拨打stations,这将为您获得所有期货。