在大多數情況下,關聯會發生在兩個不同模型的屬性之間—例如,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')
來查找 User #55 收藏的所有使用者,但是沒有辦法取得收藏 User #55 的所有使用者列表。要做到這一點,需要一個額外的屬性(例如bookmarkedBy
),它將使用via
屬性連接到bookmarkedUsers
。