我已经通过 Vapor 4 中的数据透视表设置了多对多关系 Locale <-> Site。LocaleSite
这是有效的,我可以附加Locale
到Site
,反之亦然。在数据透视表中,我添加了一个属性.sortOrder
:
final class LocaleSite : Model {
static let schema = "locale+site"
struct FieldKeys {
static var createdAt: FieldKey { "created_at" }
static var updatedAt: FieldKey { "updated_at" }
static var deletedAt: FieldKey { "deleted_at" }
static var locale: FieldKey { "localeID" }
static var site: FieldKey { "siteID" }
static var sortOrder: FieldKey { "sortOrder" }
}
@ID
var id: UUID?
@Timestamp(key: FieldKeys.createdAt, on: .create)
var createdAt: Date?
@Timestamp(key: FieldKeys.updatedAt, on: .update)
var updatedAt: Date?
@Timestamp(key: FieldKeys.deletedAt, on: .delete)
var deletedAt: Date?
@Parent(key: FieldKeys.locale)
var locale: Locale
@Parent(key: FieldKeys.site)
var site: Site
@Field(key: FieldKeys.sortOrder)
var sortOrder: Int
附加区域设置数组时
for locale in locales {
let _ = site.$locales.attach(locale, on: database)
}
我想.sortOrder
在附加时在同一个循环中将 设置为某个值(也许通过附加函数?),但在文档中找不到如何。
(目前唯一的解决方法是在附加后查询我的站点或语言环境,并通过与数据透视表设置的关系.sortOrder
。非常低效......)
添加了包含一些 Calebs 答案的代码示例(见评论)
static func createStdData (site: Site, database : Database) -> EventLoopFuture<Void> {
return Locale.allLocale(database: database).map { locales in
var order = 0
for locale in locales {
let _ = site.$locales.attach(locale, on: database, edit: { pivot in
pivot.sortOrder = order
})
order += 1
}
}
}
一旦 edit: 添加我收到以下错误:
调用实例方法“附加”时没有完全匹配
检查蒸气源,我看到有一个,但显然语法可能不完全正确......
我也试过:
let _ = site.$locales.attach(locale, on: database, edit: (LocaleSite){ pivot in
pivot.sortOrder = order
})
但我得到:
在没有更多上下文的情况下,表达式的类型是模棱两可的