蒸汽2,一对多关系

时间:2017-08-26 16:50:53

标签: swift vapor server-side-swift

您是否有任何使用Vapor 2创建一对多关系的示例? 有一些如何做到这一点的例子,但他们使用旧版本的Vapor。

感谢您提出的所有建议。

1 个答案:

答案 0 :(得分:7)

我找到了解决方案。这是一个拥有许多汽车的车主的简单例子,也许对某人有帮助。

<强>者:

final class Owner: Model {
    static let idKey = "id"
    static let nameKey = "name"
    static let carsKey = "cars"

    var name: String
    let storage = Storage()

    var cars: Children<Owner, Car> {
        return children()
    }


    init(name: String) {
        self.name = name
    }

    init(row: Row) throws {
        name = try row.get(Owner.nameKey)
    }

    func makeRow() throws -> Row {
        var row = Row()
        try row.set(Owner.nameKey, name)
        return row
    }
}

extension Owner: Preparation {

    static func prepare(_ database: Database) throws {
        try database.create(self) { builder in
            builder.id()
            builder.string(Owner.nameKey)
        }
    }

    static func revert(_ database: Database) throws {
        try database.delete(self)
    }
}

extension Owner: JSONConvertible {

    convenience init(json: JSON) throws {
        try self.init(
            name: json.get(Owner.nameKey)
        )
    }

    func makeJSON() throws -> JSON {
        var json = JSON()
        try json.set(Owner.idKey, id)
        try json.set(Owner.nameKey, name)
        try json.set(Owner.carsKey, try cars.all())
        return json
    }
}

extension Owner: ResponseRepresentable { }

extension Owner: Updateable {
    public static var updateableKeys: [UpdateableKey<Owner>] {
        return [
            UpdateableKey(Owner.nameKey, String.self) { owner, text in
                owner.name = name
            }
        ]
    }
}

<强>汽车:

final class Car: Model {
    static let idKey = "id"
    static let makeKey = "make"
    static let modelKey = "model"
    static let ownerIdKey = "owner_id"

    var make: String
    var model: String
    var ownerId: Identifier
    let storage = Storage()

    var owner: Parent<Car, Owner> {
        return parent(id: ownerId)
    }

    init(make: String, model: String, ownerId: Identifier) {
        self.make = make
        self.model = model
        self.ownerId = ownerId
    }

    init(row: Row) throws {
        make = try row.get(Car.makeKey)
        model = try row.get(Car.modelKey)
        ownerId = try row.get(Car.ownerIdKey)
    }

    func makeRow() throws -> Row {
        var row = Row()
        try row.set(Car.makeKey, make)
        try row.set(Car.modelKey, model)
        try row.set(Car.ownerIdKey, ownerId)
        return row
    }
}

extension Car: JSONConvertible {

    convenience init(json: JSON) throws {
        try self.init(
            make: json.get(Car.makeKey),
            model: json.get(Car.modelKey),
            ownerId: json.get(Car.ownerIdKey)
        )
    }

    func makeJSON() throws -> JSON {
        var json = JSON()
        try json.set(Car.idKey, id)
        try json.set(Car.makeKey, make)
        try json.set(Car.modelKey, model)
        try json.set(Car.ownerIdKey, ownerId)
        return json
    }
}

extension Car: ResponseRepresentable {}

extension Car: Preparation {

    static func prepare(_ database: Database) throws {
        try database.create(self) { builder in
            builder.id()
            builder.string(Car.makeKey)
            builder.string(Car.modelKey)
            builder.foreignId(for: Owner.self)
        }
    }

    static func revert(_ database: Database) throws {
        try database.delete(self)
    }
}

extension Car: Updateable {
    public static var updateableKeys: [UpdateableKey<Car>] {
        return [
            UpdateableKey(Car.makeKey, String.self) { car, make in
                car.make = make
            }
        ]
    }
}