【问题标题】:Vapor 2, One to Many relationVapor 2,一对多关系
【发布时间】:2018-02-04 11:08:14
【问题描述】:

您有任何关于如何使用 Vapor 2 创建一对多关系的示例吗? 有一些示例说明如何执行此操作,但它们使用的是旧版本的 Vapor。

感谢您的所有建议。

【问题讨论】:

标签: swift vapor server-side-swift


【解决方案1】:

我找到了解决办法。这是一个拥有很多汽车的车主的简单示例,可能会对某人有所帮助。

所有者:

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
            }
        ]
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    相关资源
    最近更新 更多