如何用蒸气过滤其他孩子的父母?

时间:2019-12-12 13:29:05

标签: vapor

enter image description here

我有这个要求:

router.get("/fetchOngoingReleases") { (request) -> Future<[ReleaseOut]> in
        return Release.query(on: request).filter(\.inprogress == true).all().map { releases in
                var result: [ReleaseOut] = []
                for r in releases {
                    var pageEvents: [Event] = []

                    let num = r.releaseUsers.query(on: request).filter(\.user.fbId ~~ "something").count()

                    var needAuthentication: Bool
                    if num == 0 {
                        needAuthentication = true
                    } else {
                        needAuthentication = false
                    }
                    let rOut = ReleaseOut(fbId: r.fbId, name: r.name, purpose: r.purpose, needAuthentication: needAuthentication)
                    result.append(rOut)
                }
                return result
        }
    }
}

我无法访问查询中的(???) releaseUser.user.fbId

这里的数据模型:

enter image description here

和代码中


final class Release: Content {
    var id: Int?
    var fbId: String
    var inprogress: Bool?
    var name: String
    var purpose: String

    /// Creates a new `Release`.
    init(id: Int? = nil, fbId: String, name: String, purpose: String = "normal selling") {
        self.id = id
        self.fbId = fbId
        self.name = name
        self.purpose = purpose
    }
}

extension Release {
    var releaseUsers: Children<Release, ReleaseUser> {
        return children(\.releaseId)
    }
}

final class ReleaseUser: Content {
    var id: Int?
    var releaseId: Release.ID
    var userId: User.ID

    init(id: Int? = nil, releaseId: Release.ID, userId: User.ID) {
        self.id = id
        self.releaseId = releaseId
        self.userId = userId
    }
}

extension ReleaseUser {
    var user: Parent<ReleaseUser, User> {
        return parent(\.userId)
    }
}

final class User: Content {
    var id: Int?
    var fbId: String
    var name: String

    init(id: Int? = nil, fbId: String, name: String) {
        self.id = id
        self.fbId = fbId
        self.name = name
    }
}

2 个答案:

答案 0 :(得分:2)

好吧,这里发生了几件事,但是主要的概念是您不能像这样跨不同的表跳转-您需要使用JOIN来加入ReleaseUser表到User表中,以便随后可以在fbId

上查询

答案 1 :(得分:2)

尝试将查询更改为:

Release.query(on: request).filter(\.inprogress == true).join(\ReleaseUser.releaseId, to:\Release.Id).join(\ReleaseUser.userId, to:\User.Id).alsoDecode(User.self).all()

alsoDecode将为您提供一个元组,第一个位置包含原始Release实例,第二个位置包含相应的User实例。因此,fbId应该可用:

r.1.fbId

以您为例。