swift - 当此代码运行时,为什么没有在 Vapor 中创建数据透视表条目?

标签 swift xcode fluent vapor

希望有人能看到我在这里缺少的东西。我正在尝试在用户和锦标赛(我的应用程序中的两个表)之间创建一个数据透视表条目。正如您所期望的,用户在路由过程中获得授权,最终以这种方法结束(我尝试从两侧创建枢轴,如注释行所示):

    func acceptInvitation(req: Request) -> EventLoopFuture<Response> {
        let user : User = req.auth.get(User.self)!
        let uId : UUID = user.id!
        let iId = UUID.init(uuidString: req.parameters.get("iId")!)
        return Invitation.query(on: req.db)
            .filter(\.$id == iId!)
            .with(\.$owner)
            .first().flatMap { i -> EventLoopFuture<Response> in
                i?.acceptances!.append((uId))
                i?.update(on: req.db)
                i!.owner.acceptances!.append(uId)
                i?.owner.update(on: req.db)
                i?.owner.$tournamentPlayers.attach(user, on: req.db)
//                user.$playerTournaments.attach(i!.owner, on: req.db)
                return req.eventLoop.future(req.redirect(to: "/")).encodeResponse(for: req)
            }
    }

迁移顺利,postgres 将其显示为:

vapor-database=# \d tournament-player-pivot;
        Table "public.tournament-player-pivot"
    Column    | Type | Collation | Nullable | Default 
--------------+------+-----------+----------+---------
 id           | uuid |           | not null | 
 tournamentID | uuid |           | not null | 
 playerID     | uuid |           | not null | 
Indexes:
    "tournament-player-pivot_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "tournament-player-pivot_playerID_fkey" FOREIGN KEY ("playerID") REFERENCES users(id)
    "tournament-player-pivot_tournamentID_fkey" FOREIGN KEY ("tournamentID") REFERENCES tournament(id)

在锦标赛中,它是这样定义的:

    @Siblings(
      through: TournamentPlayerPivot.self,
      from: \.$tournament,
      to: \.$player)
    var tournamentPlayers: [User]

相反,在用户中是:

    @Siblings(
      through: TournamentPlayerPivot.self,
      from: \.$player,
      to: \.$tournament)
    var playerTournaments: [Tournament]

所有这些似乎都非常严格地遵循标准实践。但是当调用上面的方法时(所有其他代码都按预期执行),表中没有条目。

编辑:我省略了枢轴的类:这里是:

import Foundation
import Fluent

final class TournamentPlayerPivot: Model {
    static let schema = "tournament-player-pivot"

    @ID
    var id: UUID?
    @Parent(key: "tournamentID")        var tournament: Tournament
    @Parent(key: "playerID")              var player: User

    init() {}

    init(
        id: UUID? = nil,
        tournament: Tournament,
        player: User
        ) throws {
            self.id = id
            self.$tournament.id = try tournament.requireID()
            self.$player.id = try player.requireID()
        }
}

最佳答案

这两个更新和附件可能会发生冲突。我会尝试将您的代码重新构造为:

func acceptInvitation(req: Request) -> EventLoopFuture<Response> {
    let user : User = req.auth.get(User.self)!
    let uId : UUID = user.id!
    let iId = UUID.init(uuidString: req.parameters.get("iId")!)
    return Invitation.query(on: req.db)
        .filter(\.$id == iId!)
        .with(\.$owner)
        .first().flatMap { i -> EventLoopFuture<Response> in
            i?.acceptances!.append((uId))
            i?.update(on: req.db).flatMap { _ in
                i!.owner.acceptances!.append(uId)
                i?.owner.update(on: req.db).flatMap { _ in
                    i?.owner.$tournamentPlayers.attach(user, on: req.db).flatMap { _ in
                        return req.eventLoop.future(req.redirect(to: "/")).encodeResponse(for: req)
                    }
                }
            }
        }
}

我确实在多次更新的上下文中看到了丢失/未更改的数据,在这种情况下,您没有映射 future 的结果并“等待”早期更新的发生。我的猜测是附加也发生了类似的情况。您可能会遇到一些编译器的问题,并且需要插入显式返回类型。

关于swift - 当此代码运行时,为什么没有在 Vapor 中创建数据透视表条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68689936/

相关文章:

swift - 为什么它总是只显示第一个警报?

swift :设置@IBOutlet静态

swift - UIAlertController 中的内存泄漏关闭

快速组合 : Using timer publisher in an observable object

c# - 了解如何创建流畅的界面

swift - 'requestReview()' 在 iOS 14.0 中被弃用

ios - 从 Swift 中的 Socket 获取响应

ios - map View 中注释的标注操作

mysql - php laravel Eloquent : is it possible to build an update query with SET WHEN

php - 为什么我们必须将克隆分配给新变量?