除了像是 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 的方法。但請注意,兩種方法都有效。