swift - 使用 Fluent 保存两个模型并从数据库中检索记录时出现问题

标签 swift vapor fluent-orm

我刚刚开始编程和 vapor,遇到以下查询问题。

当用户向/api/trip/new 发出创建新行程的请求时,我想从数据库中检索第一个司机并将他们的 ID 分配给一个 Trip 对象。然后我想将行程和行程请求都保存在数据库中。

我有以下代码:

func newTripHandler(_ req: Request, data: TripRequestCreateData) throws -> Future<TripRequest> {
let passenger = try req.requireAuthenticated(Passenger.self)
let tripRequest = try TripRequest(pickupLat: data.pickupLat,
                                  pickupLng: data.pickupLng,
                                  destLat: data.destLat,
                                  destLng: data.destLng,
                                  pickupAddress: data.pickupAddress,
                                  destAddress: data.destAddress,
                                  passengerId: passenger.requireID())

//Passenger's location
let lat = tripRequest.pickupLat
let lng = tripRequest.pickupLng

//Passenger's destination
let toLat = tripRequest.destLat
let toLng = tripRequest.destLng

let trip = Trip(passengerId: tripRequest.passengerId!,
                pickupLat: lat,
                pickupLng: lng,
                destLat: toLat,
                destLng: toLng,
                pickupAddress: tripRequest.pickupAddress,
                destAddress: tripRequest.destAddress)

let driver = Driver.query(on: req).first().unwrap(or: Abort(.notFound))

let driverId = driver.map(to: Driver.self) { driver in
  return driver.id
}

trip.driverId = driverId

print(trip)

return tripRequest.save(on: req)
}

struct TripRequestCreateData: Content {
  let pickupLat: Double
  let pickupLng: Double
  let destLat: Double
  let destLng: Double
  let pickupAddress: String
  let destAddress: String
}

我不确定如何保存两个模型以及如何从数据库中正确检索驱动程序。 driverId 常量的类型是 EventLoopF​​uture 而不是 Driver,因此我无法将 ID 分配给行程的 driverId 属性。

如何调整我的代码来实现这一点?

最佳答案

使用数据库时,您只会得到Future。 (更多关于 Future 的信息在 The Vapor Docs 中。)

因此,要获取驱动程序,您已经使用了正确的代码,但必须在 map 代码块中继续。当在 map 中返回一个 Future 时,使用 flatMap,所以你在 中没有一个 Futures > future

试试这个:

return Driver.query(on: req).first().unwrap(or: Abort(.notFound)).flatMap { driver in
    trip.driverId = driver.id

    return trip.save(on: req).flatMap { trip in
        return tripRequest.save(on: req)
    }
}

(我选择这种方式来展示 Future 的工作原理 - 有一些方法可以使代码更清晰,例如链接 Future 或使用 flatten.)

关于swift - 使用 Fluent 保存两个模型并从数据库中检索记录时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54672314/

相关文章:

Swift - 手动转换后关闭最后一个 View Controller

swift - 如何将这种副作用转化为优雅的 Vapor 操作链?

swift - vapor 构建命令不适用于 Swift 3.0

swift - 如何解析在 Body(Request) 中发送的 json 对象

ios - 以模态方式显示另一个 vc 时,CABasicAnimation 完成

ios - 收藏 View 动画

ios - 无法打开谷歌地图