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