在Vapor Fluent中异步创建1对1关系



VaporFluent问题。我有以下代码将User保存为Postgres

User
@Parent(key: FieldKeys.profile) var profile: Profile

let profile = User.Profile()
try await profile.save(on: request.db)

if let profileID = try await User.Profile.query(on: request.db).all().last?.id {
user.$profile.id = profileID; print("Profile created with ID=(profileID)")
}
try await user.save(on: request.db)

我担心的是,另一个请求可能同时出现,并在Profile表中创建一个条目,其id将作为最后一个而不是前一个条目的id返回。

是否有保证的方法来创建用户配置文件关系?

Vapor能够创建事务,因此您可以确定不会有任何干预。试试类似的东西:

try await request.db.transaction { database in
let user = try await User.query...
let profile = Profile()
try await profile.save(on: database)
user.$profile.id = profile.id
try await user.save(on: database)
}

在Fluent中保存模型时,会根据查询中返回的数据为您填充ID。所以你可以写

let profile = User.Profile()
try await profile.save(on: request.db)
let profileID = try profile.requireID()         
user.$profile.id = profileID
try await user.save(on: request.db)

您也可以使用Fluent 的attach助手之一

最新更新