.addToCollection()
將一個或多個現有的子記錄新增至指定的集合 (例如 BlogPost #4 的 comments
評論)。
await Something.addToCollection(parentId, association)
.members(childIds);
參數 | 類型 | 詳細資訊 | |
---|---|---|---|
1 | parentId | 父記錄的主鍵值 (即 ID)。 必須是數字或字串 (例如 '507f191e810c19729de860ea' 或 49 )。或者,可以指定數字或字串的陣列 (例如 ['507f191e810c19729de860ea', '14832ace0c179de897'] 或 [49, 32, 37] )。在這種情況下,所有的子記錄將會被新增到每個父記錄的適當集合中。 |
|
2 | 關聯 | 複數(「集合」)關聯的名稱 (例如 "pets"「寵物」)。 | |
3 | childIds | 要新增的子記錄的主鍵值 (即 ID)。請注意,這不會 建立 這些子記錄,它只是將它們連結到指定的父記錄。 |
名稱 | 類型 | 何時? |
---|---|---|
UsageError | 如果傳入無效的內容,則會拋出。 | |
AdapterError | 如果資料庫配接器發生錯誤,則會拋出。 | |
Error | 如果發生任何其他意外情況,則會拋出。 |
請參閱 Concepts > Models and ORM > Errors,以取得在 Sails 和 Waterline 中處理錯誤的範例。
對於使用者 3,將寵物 99 和 98 新增到 "pets" 集合
await User.addToCollection(3, 'pets')
.members([99,98]);
如果任一使用者記錄的 "pets" 集合中已經有這些寵物之一,那麼我們就會靜默地跳過它。
如果提供了空的父 ID 陣列,那麼這將是一個 空操作 (no-op)。
如果父 ID (或任何一個父 ID,如果指定為陣列) 實際上不對應於現有的、已持久化的記錄,則確切的行為取決於這是哪種類型的關聯
同樣地,如果其中一個子 ID 實際上不對應於現有的、已持久化的記錄,則
如果父記錄的集合已經有一個或多個這些子記錄作為成員,那麼基於效能考量,這些成員關係可能會被再次追蹤 (例如,多次儲存在您的資料庫的 join table 中)。在大多數情況下,這沒問題,因為它通常不會影響未來的查詢 (例如,當填充相關父記錄的集合時,重複追蹤的關係不會導致子記錄被列出超過一次)。如果您確實需要防止重複的 join table 記錄,有一個簡單的方法可以解決這個問題—假設您使用的是關聯式資料庫,例如 MySQL 或 PostgreSQL,那麼您可以在您的 join table 上建立多欄索引。這樣做將會導致像這樣的查詢產生 AdapterError,並帶有 code: 'E_UNIQUE'
。
- 此方法可以與
await
、Promise 鏈或 傳統的 Node 回呼 一起使用。
- 如果關聯是「雙向的」(表示它有
via
屬性),那麼子記錄將會相應地被修改。如果另一側的屬性是單數,那麼每個子記錄的外鍵將會被更改。如果是複數,那麼每個子記錄的集合將會相應地被修改。
- 此外,如果
via
指向另一側的單數(「模型」)屬性,那麼.addToCollection()
將會在必要時「竊取」這些子記錄。例如,假設您有一個 Employee 模型,具有這個複數(「集合」)屬性:involvedInPurchases: { collection: 'Purchase', via: 'cashier' }
。如果您執行Employee.addToCollection(7, 'involvedInPurchases', [47])
以將此購買分配給員工 #7 (Dolly),但購買 #47 已經與另一位員工關聯 (例如 #12, Motoki),那麼這會從 Motoki 那裡「竊取」購買,並將其給予 Dolly。換句話說,如果您執行Employee.find([7, 12]).populate('involvedInPurchases')
,Dolly 的involvedInPurchases
陣列將會包含購買 #47,而 Motoki 的則不會。