【问题标题】:How to filter other parent of child with Vapor?如何用 Vapor 过滤孩子的其他父母?
【发布时间】:2019-12-12 13:29:05
【问题描述】:

我有这个要求:

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

这里是数据模型:

在代码中


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
    }
}

【问题讨论】:

    标签: vapor


    【解决方案1】:

    尝试将您的查询更改为:

    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
    

    在你的情况下。

    【讨论】:

      【解决方案2】:

      好的,这里发生了几件事,但主要概念是您不能像那样跳过不同的表 - 您需要使用 JOINReleaseUser 表加入到 @987654323 @table 这样你就可以查询fbId

      【讨论】:

      • 我想是不是像Core Data,我可以像这样链接查询:relationship1.relationships2.attribute。但似乎没有。
      • 不,很遗憾,您需要手动构建该查询
      猜你喜欢
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2018-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多