Vapor中相同模型之间的兄弟姐妹关系

时间:2019-03-16 20:41:43

标签: swift relationship vapor

我有一个User模型,我想向其中添加一个friends属性。朋友,应该是其他User个。

我创建了UserFriendsPivot

final class UserFriendsPivot: MySQLPivot, ModifiablePivot {
    var id: Int?
    var userID: User.ID
    var friendID: User.ID

    typealias Left = User
    typealias Right = User

    static var leftIDKey: WritableKeyPath<UserFriendsPivot, Int> {
        return \.userID
    }

    static var rightIDKey: WritableKeyPath<UserFriendsPivot, Int> {
        return \.friendID
    }

    init(_ user: User, _ friend: User) throws {
        self.userID   = try user  .requireID()
        self.friendID = try friend.requireID()
    }
}

extension UserFriendsPivot: Migration {
    public static var entity: String {
        return "user_friends"
    }
}

我将friends属性添加到User

var friends: Siblings<User, User, UserFriendsPivot> {
    return siblings()
}

现在,我在return siblings()的行上看到以下错误:

  

“兄弟姐妹(相关:通过:)”的歧义用法

我尝试将其替换为:

return siblings(related: User.self, through: UserFriendsPivot.self)

...没有任何运气。

我知道两个代码段应该可以正常工作,因为我是从我在EventUser之间建立的另一个兄弟姐妹关系中直接复制过来的,它们工作正常。
我看到的唯一区别是,我正在尝试在相同模型之间建立关系。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

尝试将您的friends定义替换为以下内容:

var friends: Siblings<User,UserFriendsPivot.Right, UserFriendsPivot> {
    return User.siblings()
}

编辑:

它应该与LeftRight作为同一个表一起使用,但是似乎失败了,因为别名解析为基值。即Xcode中的自动完成功能显示siblings的所有候选者最终都属于以下类型:

Siblings<User, User, UserFriendsPivot> siblings(...)

代替:

Siblings<User, UserFriendsPivot.Right, UserFriendsPivot> siblings(...)

和类似的

我建议在GitHub上提出一个错误。同时,如何创建具有不同名称和设置的User副本:

static let entity = "User"

使用相同的物理表。不漂亮,但这可能会让您工作。

答案 1 :(得分:0)

这里的问题是,在同一个ModelUser-User)兄弟姐妹关系中,Fluent无法推断您指的是哪个兄弟姐妹–需要指定边。

extension User {
    // friends of this user
    var friends: Siblings<User, User, UserFriendsPivot> {
        return siblings(UserFriendsPivot.leftIDKey, UserFriendsPivot.rightIDKey)
    }

    // users who are friends with this user
    var friendOf: Siblings<User, User, UserFriendsPivot> {
        return siblings(UserFriendsPivot.rightIDKey, UserFriendsPivot.leftIDKey)
    }
}

另一个与Model相同的结果是,您将无法使用attach便捷方法将其添加到数据透视表中,而需要手动创建:

let pivot = try UserFriendsPivot(user, friend)
pivot.save(on: req)

(还有其他解决方法,我只是在最容易使用的上方找到了这些简单的方法。指定边并反转关键位置以获得逆关系是重要的概念。)


grundoon

回答