Сбой при соединении с Fluent in Vapor - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть две модели, и они имеют отношение один-много. Вот мои занятия.

Бронирование

final class Booking: PostgreSQLModel {
    /// The unique identifier for this `Todo`.
    var id: Int?

    /// A title describing what this `Todo` entails.
    var user_id: User.ID
    var product_id: Product.ID
    var count: Int

    /// Creates a new `Todo`.
    init(id: Int? = nil, user_id: User.ID, product_id: Product.ID, count: Int) {
        self.id = id
        self.user_id = user_id
        self.product_id = product_id
        self.count = count
    }
}
extension Booking {
    var user: Parent<Booking, User> {
        return parent(\.user_id)
    }
    var product: Parent<Booking, Product> {
        return parent(\.product_id)
    }
}

Продукт

final class Product: PostgreSQLModel {
    /// The unique identifier for this `Todo`.
    var id: Int?

    /// A title describing what this `Todo` entails.
    var name: String
    var image_url: String
    var description: String
    var price: Int?

    /// Creates a new `Todo`.
    init(id: Int? = nil, name: String, image_url: String, description: String, price: Int) {
        self.id = id
        self.name = name
        self.image_url = image_url
        self.description = description
        self.price = price
    }
}
extension Product {
    var bookings: Children<Product, Booking> {
        return children(\.product_id)
    }
}

Теперь я хочу получить все заказы пользователя, и при каждом бронировании я хочу получать также информацию о продукте. Поэтому для этого я попытался объединить таблицы Booking и Product, но это вызывает исключение.

Неустранимая ошибка: 'попробуй!' выражение неожиданно вызвало ошибку: ⚠️ CoreError: Parent<Booking, Product> не соответствует ReflectionDecodable. - id: CoreError.ReflectionDecodable : file /BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang_Fall2018/swiftlang_Fall2018-1000.11.42/src/swift/stdlib/public/core/ErrorType.swift, строка 184 Программа завершилась с кодом выхода: 9

Вот мой код для присоединения.

let booking = Booking.query(on: req).join(\Product.bookings, to:\Booking.product).filter(\.user_id == userID).decode(BookingM.self).all()

1 Ответ

0 голосов
/ 30 апреля 2019

Прежде всего, с вашим запросом вам не нужно присоединяться к таблице Product, потому что вы никогда не запрашиваете и не декодируете ее.

Ваш оператор join:

.join(\Product.bookings, to:\Booking.product)

Неверно.Вместо того, чтобы присоединяться к свойству Product.bookings, вы должны присоединиться к свойству Product.id, потому что идентификатор продукта - это то, что содержится в свойстве Booking.product.

Таким образом, ваш свободный запрос должен выглядеть примерно так:

let booking = Booking.query(on: req).join(\Booking.product, to:\Product.id).filter(\.user_id == userID).all()

Я удалил вызов .decoding, поскольку запрос уже декодирует и результат запроса Booking.

Чтобы использовать свойство bookings, ваш запрос будет выглядеть следующим образом:

let booking = product.bookings.query(on: req).filter(\Booking.user_id == userID).all()
...