Vapor join and AlsoDecode产生很多嵌套的元组

问题描述 投票:1回答:1

根据问题的答案:vapor - Obtaining data from mysql using alsodecode()我能够通过多个联接为我的模型重现此内容。

这导致了多个嵌套元组,我必须访问它们才能获得连接的值。是否可以进行其他类型的连接或将此元组结构展平到一个级别?

struct MyTuple: Encodable, Content {
    let title: String
    let publicationDate: Date
    let authorID: Author.ID
    let authorName: String
    let categoryID: Category.ID
    let categoryName: String
    let language: String
}

struct MyContext: Encodable {
    let title: String
    let books: [MyTuple]
}

func getBooks(_ req: Request) throws -> Future<[MyTuple]> {
    return Book.query(on: req)
        .join(\Category.id, to: \Book.categoryID)
        .join(\Language.id, to: \Book.languageID)
        .join(\ProgrammingLanguage.id, to: \Book.programmingLanguageID)
        .join(\Author.id, to: \Book.authorID)
        .alsoDecode(Category.self)
        .alsoDecode(Language.self)
        .alsoDecode(ProgrammingLanguage.self)
        .alsoDecode(Author.self)
        .sort(\Book.publicationDate, .descending).all().flatMap(to: [MyTuple].self) { tuples in
            print(tuples)
            var tempTuples: [MyTuple] = []
            for tuple in tuples {
                tempTuples.append(try MyTuple(
                        title: tuple.0.0.0.0.title,
                        publicationDate: tuple.0.0.0.0.publicationDate,
                        authorID: tuple.1.requireID(),
                        authorName: "\(tuple.1.name) \(tuple.1.surname)",
                        categoryID: tuple.0.0.0.1.requireID(),
                        categoryName: tuple.0.0.0.1.name, language: tuple.0.0.1.code ) )
            }

            return Future.map(on: req) {
                tempTuples
            }
        }
}
swift vapor vapor-fluent
1个回答
1
投票

可以通过原始查询来完成,类似这样

© www.soinside.com 2019 - 2024. All rights reserved.