我有一个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)
...没有任何运气。
我知道两个代码段应该可以正常工作,因为我是从我在Event
和User
之间建立的另一个兄弟姐妹关系中直接复制过来的,它们工作正常。
我看到的唯一区别是,我正在尝试在相同模型之间建立关系。
我该怎么办?
答案 0 :(得分:1)
尝试将您的friends
定义替换为以下内容:
var friends: Siblings<User,UserFriendsPivot.Right, UserFriendsPivot> {
return User.siblings()
}
编辑:
它应该与Left
和Right
作为同一个表一起使用,但是似乎失败了,因为别名解析为基值。即Xcode中的自动完成功能显示siblings
的所有候选者最终都属于以下类型:
Siblings<User, User, UserFriendsPivot> siblings(...)
代替:
Siblings<User, UserFriendsPivot.Right, UserFriendsPivot> siblings(...)
和类似的
我建议在GitHub上提出一个错误。同时,如何创建具有不同名称和设置的User
副本:
static let entity = "User"
使用相同的物理表。不漂亮,但这可能会让您工作。
答案 1 :(得分:0)
这里的问题是,在同一个Model
(User-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)
(还有其他解决方法,我只是在最容易使用的上方找到了这些简单的方法。指定边并反转关键位置以获得逆关系是重要的概念。)