【发布时间】:2019-06-20 17:45:24
【问题描述】:
我目前正在努力使用蒸汽/流利进行 upsert。我有一个类似这样的模型:
struct DeviceToken: PostgreSQLModel {
var id: Int?
var token: String
var updatedAt: Date = Date()
init(id: Int? = nil, token: String, updatedAt: Date = Date()) {
self.id = id
self.token = token
self.updatedAt = updatedAt
}
}
struct Account: PostgreSQLModel {
var id: Int?
let username: String
let service: String
...
let deviceTokenId: DeviceToken.ID
init(id: Int? = nil, service: String, username: String, ..., deviceTokenId: DeviceToken.ID) {
self.id = id
self.username = username
....
self.deviceTokenId = deviceTokenId
}
}
来自客户端的类似
{
"deviceToken": {
"token": "ab123",
"updatedAt": "01-01-2019 10:10:10"
},
"account": {
"username": "user1",
"service": "some service"
}
}
正在发送。
如果新模型不存在,我想做的是插入新模型,否则更新它们。我看到了create(orUpdate:) 方法,但是只有在 id 相同的情况下才会更新(在我的理解中)。由于客户端不发送 id 我不太确定如何处理这个。
我也无法解码模型,因为帐户是在没有deviceTokenId 的情况下发送的,因此解码将失败。我想我可以通过覆盖 NodeCovertible 或使用两种不同的模型(一个用于解码没有 id 的 json 和上面的实际模型)来解决后一个问题。然而,第一个问题仍然存在。
我真正想做的是:
如果带有令牌的条目已经存在,则更新 DeviceToken,否则创建它
如果用户名和服务组合的帐户已经存在,则更新其用户名、服务和 deviceTokenId,否则创建它。 DeviceTokenId是1返回的id。
你有没有机会在这里帮助我?
【问题讨论】:
标签: swift vapor server-side-swift