使用 Fluent 保存两个模型并从数据库中检索记录时出现问题
Problem saving two models and retrieving a record from the database with Fluent
我刚刚开始编程和 vapor,遇到以下查询问题。
当用户向 /api/trip/new 发出创建新行程的请求时,我想从数据库中检索第一个 driver 并将其 ID 分配给行程 object。然后我想把旅行和旅行请求都保存在数据库中。
我有以下代码:
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
}
我不确定如何保存两个模型以及如何从数据库中正确检索 driver。 driverId 常量的类型是 EventLoopFuture 而不是 Driver,因此我无法将 ID 分配给行程的 driverId 属性。
如何调整我的代码来实现这一点?
使用数据库时,您只会得到 Future
s。 (更多关于 The Vapor Docs 中的 Future
s。)
所以要获取驱动程序,您已经使用了正确的代码,但必须在 map
代码块中继续。当在 map
中返回 Future
时,使用 flatMap
,因此 Futures
中没有 Futures
。
试试这个:
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
s 是如何工作的 - 有一些方法可以使代码更清晰,例如链接 Future
s 或使用 flatten
。)
我刚刚开始编程和 vapor,遇到以下查询问题。
当用户向 /api/trip/new 发出创建新行程的请求时,我想从数据库中检索第一个 driver 并将其 ID 分配给行程 object。然后我想把旅行和旅行请求都保存在数据库中。
我有以下代码:
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
}
我不确定如何保存两个模型以及如何从数据库中正确检索 driver。 driverId 常量的类型是 EventLoopFuture 而不是 Driver,因此我无法将 ID 分配给行程的 driverId 属性。
如何调整我的代码来实现这一点?
使用数据库时,您只会得到 Future
s。 (更多关于 The Vapor Docs 中的 Future
s。)
所以要获取驱动程序,您已经使用了正确的代码,但必须在 map
代码块中继续。当在 map
中返回 Future
时,使用 flatMap
,因此 Futures
中没有 Futures
。
试试这个:
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
s 是如何工作的 - 有一些方法可以使代码更清晰,例如链接 Future
s 或使用 flatten
。)