在大多数情况下,关联将存在于两个不同模型的属性之间——例如,User
模型和 Pet
模型之间的关系。但是,在同一个模型中的两个属性之间也可能存在关系。这被称为自反关联。
考虑以下 User
模型
// myApp/api/models/User.js
module.exports = {
attributes: {
firstName: {
type: 'string'
},
lastName: {
type: 'string'
},
// Add a singular reflexive association
bestFriend: {
model: 'user',
},
// Add one side of a plural reflexive association
parents: {
collection: 'user',
via: 'children'
},
// Add the other side of a plural reflexive association
children: {
collection: 'user',
via: 'parents'
},
// Add another plural reflexive association, this one via-less
bookmarkedUsers: {
collection: 'user'
}
}
};
上面示例 User
模型中的自反关联与任何其他关联的工作方式相同。单数 bestFriend
属性可以设置为另一个用户的 主键(或者对于自恋者,可以设置为同一个用户!)。parents
和 children
属性可以使用 .addToCollection()
、.removeFromCollection()
和 .replaceCollection()
进行修改。请注意,与所有复数关联一样,添加到一侧将允许从任一侧访问关系,因此运行
// Add User #12 as a parent of User #23
await User.addToCollection(23, 'parents', 12);
// Find User #12 and populate its children
var userTwelve = await User.findOne(12).populate('children');
将返回类似以下内容
{
id: 12,
firstName: 'John',
lastName: 'Doe',
bestFriend: null,
children: [
{
id: 23,
firstName: 'Jane',
lastName: 'Doe',
bestFriend: null
}
]
}
与所有“无 via”复数关联一样,自反无 via 关联只能从声明它们的侧访问。在上面的
User
模型中,您可以执行User.findOne(55).populate('bookmarkedUsers')
以找到用户 #55 标记的所有用户,但无法获取已标记用户 #55 的所有用户的列表。要做到这一点,需要一个额外的属性(例如bookmarkedBy
),它将使用via
属性与bookmarkedUsers
连接。