Pivot
类来建模多对多关系。因为这是一种自引用关系,为了避免ID键冲突,您可能会发现创建自己的“直通”模型最容易。
import FluentProvider
import Vapor
final class Subscription: Model, PivotProtocol {
typealias Left = User
typealias Right = User
var subscriberId: Identifier
var subscribedId: Identifier
init(
subscriberId: Identifier,
subscribedId: Identifier
) {
self.subscriberId = subscriberId
self.subscribedId = subscribedId
}
let storage = Storage()
static let leftIdKey = "subscriber_id"
static let rightIdKey = "subscribed_id"
init(row: Row) throws {
subscriberId = try row.get("subscriber_id")
subscribedId = try row.get("subscribed_id")
}
func makeRow() throws -> Row {
var row = Row()
try row.set("subscriber_id", subscriberId)
try row.set("subscribed_id", subscribedId)
return row
}
}
extension User {
var subscribers: Siblings<User, User, Subscription> {
return siblings(localIdKey: "subscriber_id", foreignIdKey: "subscribed_id")
}
var subscribed: Siblings<User, User, Subscription> {
return siblings(localIdKey: "subscribed_id", foreignIdKey: "subscriber_id")
}
}