Vapor4 的表现力是很丰富的,提供了 @Enum
property 和 database.enum(_:)
builder。
比如有下面这么个例子:
enum Bar: String, Codable {
case baz, qux
}
final class Foo: Model {
static let schema = "foos"
@ID(key: .id)
var id: UUID?
@Enum(key: "bar")
var bar: Bar
init() { }
init(id: IDValue? = nil, bar: Bar) {
self.id = id
self.bar = bar
}
}
需要向数据库注册新的枚举,可以使用 database.enum
来完成
struct FooMigration: Migration {
func prepare(on database: Database) -> EventLoopFuture<Void> {
database.enum("bar")
.case("baz")
.case("qux")
.create()
.flatMap
{ bar in
database.schema("foos")
.field("id", .uuid, .identifier(auto: false))
.field("bar", bar, .required)
.create()
}
}
func revert(on database: Database) -> EventLoopFuture<Void> {
database.schema("foos").delete().flatMap {
database.enum("bar").delete()
}
}
}
如果在后面我们需要增加个枚举值
enum Bar: String, Codable {
case baz, qux, quuz
}
需要迁移才能更新数据库,通过新增 BarAddQuuzMigration
来完成更新
struct BarAddQuuzMigration: Migration {
func prepare(on database: Database) -> EventLoopFuture<Void> {
database.enum("bar")
.case("quuz")
.update()
.flatMap
{ bar in
database.schema("foos")
.updateField("bar", bar)
.update()
}
}
func revert(on database: Database) -> EventLoopFuture<Void> {
database.enum("bar")
.deleteCase("quuz")
.update()
.flatMap
{ bar in
database.schema("foos")
.updateField("bar", bar)
.update()
}
}
}
非常香的功能,i like it!
swift vapor 在国内还是比较低迷的,中文资料比较欠缺,个人整理一份 vapor faqs,让那些打算学习 Vapor 的国内开发者少走弯路。仓库将持续更新。感兴趣的的可以关注下。
更多阅读请关注官方微信公众号: Oldbirds