Проблема с сохранением двух моделей и извлечением записи из базы данных с помощью Fluent - PullRequest
0 голосов
/ 13 февраля 2019

Я только начал работать с программированием и паром, и у меня возникла следующая проблема с запросами:

Когда пользователь отправляет запрос в / api / trip / new, чтобы создать новую поездку, я хочу получитьПервый драйвер из базы данных и назначить их идентификатор для объекта 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 имеет тип EventLoopFuture вместо Driver, поэтому я не могу присвоить идентификатор свойству driverId поездки.

Как мне настроить свой код для достижения этой цели?

1 Ответ

0 голосов
/ 13 февраля 2019

При работе с базой данных вы получаете только Future с.(Подробнее о Future s в The Vapor Docs .)

Таким образом, чтобы получить драйвер, вы уже использовали правильный код, но должны войти в кодовый блок map.Возвращая Future внутри map, используйте 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.)

...