Сбой при соединении с Fluent in Vapor
У меня есть две модели, и они имеют отношение один-много. Вот мои занятия.
бронирование
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 ответ
Во-первых, с вашим запросом вам не нужно присоединяться к 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()