除了像string
和number
这样的字面类型外,Sails 模型中的属性还可以表示数据存储中其他记录的链接。这种类型的属性称为关联。例如,给定一个User
模型和一个Pet
模型,User
可以包含一个pets
属性,该属性将给定的用户链接到一个或多个宠物。
根据链接的类型,可以在.create()
或.update()
调用中通过赋予它另一条记录的主键值来设置关联属性,或者使用特殊的模型方法,如.addToCollection
、.removeFromCollection()
或.replaceCollection()
。
与普通属性不同,关联属性值在使用.find()
或.findOne()
检索记录时并不总是返回。相反,您可以使用.populate()
方法声明要检索的关联。
// Find a single user, including its pets
var userWithPets = await User.findOne(123).populate('pets');
关联属性在返回的记录中如何表示取决于关联的类型、是否存在实际链接的记录以及是否将.populate()
链接到查询。有关返回记录中关联属性的预期类型的完整描述,请参阅此表。
使用 Sails 和 Waterline,您可以在多个数据存储之间关联模型。这意味着,即使您的用户驻留在PostgreSQL中,他们的评论驻留在MongoDB中,您也可以像它们驻留在同一个数据库中一样与数据进行交互。您还可以使用相同的适配器跨不同的数据存储建立关联。例如,如果您的应用程序需要访问/更新公司数据中心中某个地方的MySQL数据库中存储的旧版配方数据,但还需要从云中的全新 MySQL 数据库中存储/检索配料数据,这将非常方便。
重要说明
在教程和示例代码中,您有时可能会看到关联的
collection
、model
或through
属性引用小写(标识)或大写(全局 ID)的模型。例如,在以下关联中,collection
属性设置为product
——称为Product
的 Sails 模型的标识。wishlist: { collection: 'product', via: 'wishlistedBy' }
在 Sails 文档中,我们始终使用全局 ID 方法以确保一致性。但请注意,这两种方法都可以使用。