Vapor4 定义数据模型的时候,遇到枚举类型咋办?

562 阅读1分钟

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 的国内开发者少走弯路。仓库将持续更新。感兴趣的的可以关注下。

swiftclub/vapor-faqs

更多阅读请关注官方微信公众号: Oldbirds