代码之家  ›  专栏  ›  技术社区  ›  János

如何查询更多记录并使用Vapor进行处理?

  •  0
  • János  · 技术社区  · 6 年前

    路由器在JSON中接收更多ID。需要对每个Id执行查询。然后对原始数据进行一些操作并返回它。但是我犯了一些错误。如何管理 Futures ? 每个查询将返回一个唯一的未来?我需要检查一下什么时候一切都好 期货

    我这样做:

    router.post([Page].self, at: "/releases") { (request, pages) -> [Page] in
        for page in pages {
            for event in page.events {
                let release = Release.query(on: request).filter(\.fbId == event.id).first().flatMap { (release) -> EventLoopFuture<Release?> in
                    return request.future(release)
                }
                if let release2 = release {
                    event.started = release2.started
                }
            }
        }
        return pages
    }
    

    但这也带来了一些错误:

    enter image description here


    使用以下JSON:

    [
        {
            "id": "107120697426006",
            "name": "Teszt Színház",
            "events": [
                {
                    "id": "802128100247740",
                    "name": "Teszt Esemény"
                },
                {
                    "id": "1378145475685730",
                    "name": "Teszt Esemény 2"
                }
            ]
        }
    ]
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   imike    6 年前

    这样的办法应该行得通

    router.post([Page].self, at: "/releases") { (req, pages) -> Future<[Page]> in
        var result: [Page] = []
        return pages.map { p in
            var page = p
            var pageEvents: [Event] = []
            return page.events.map { e in
                var event = e
                return Release.query(on: req).filter(\.fbId == event.id).first().map { release in
                    if let release = release {
                        event.started = release.started
                    }
                    pageEvents.append(event)
                }
            }.flatten(on: req).map {
                page.events = pageEvents
                result.append(page)
            }
        }.flatten(on: req).transform(to: result)
    }
    

    import FluentSQL // for `~~` operator
    
    router.post([Page].self, at: "/releases") { (req, pages) -> Future<[Page]> in
        let eventIds = pages.map { $0.events }.flatMap { $0 }.map { $0.id }
        return Release.query(on: req).filter(\.fbId ~~ eventIds).all().map { releases in
            var result: [Page] = []
            for p in pages {
                var page = p
                var pageEvents: [Event] = []
                for e in p.events {
                    var event = e
                    if let release = releases.first(where: { $0.fbId == e.id }) {
                        event.started = release.started
                    }
                    pageEvents.append(event)
                }
                page.events = pageEvents
                result.append(page)
            }
            return result
        }
    }
    
    推荐文章