.addToCollection()
将一个或多个现有的子记录添加到指定的集合中(例如,BlogPost #4 的 comments
)。
await Something.addToCollection(parentId, association)
.members(childIds);
参数 | 类型 | 详情 | |
---|---|---|---|
1 | parentId | 父记录的主键值(即 ID)。 必须是数字或字符串(例如 '507f191e810c19729de860ea' 或 49 )。或者,可以指定一个数字或字符串数组(例如 ['507f191e810c19729de860ea', '14832ace0c179de897'] 或 [49, 32, 37] )。在这种情况下,所有子记录都将添加到每个父记录的相应集合中。 |
|
2 | association | 复数(“集合”)关联的名称(例如,“pets”)。 | |
3 | childIds | 要添加的子记录的主键值(即 ID)。请注意,这不会创建这些子记录,它只是将它们链接到指定的父记录。 |
名称 | 类型 | 何时发生 |
---|---|---|
UsageError | 如果传入无效内容,则抛出此错误。 | |
AdapterError | 如果数据库适配器中出现错误,则抛出此错误。 | |
Error | 如果发生任何其他意外情况,则抛出此错误。 |
有关在 Sails 和 Waterline 中处理错误的示例,请参阅概念 > 模型和 ORM > 错误。
对于用户 3,将宠物 99 和 98 添加到“pets”集合中
await User.addToCollection(3, 'pets')
.members([99,98]);
如果任一用户记录在其“pets”中已经拥有其中一个宠物,则我们只是静默跳过它。
如果提供了空的父 ID 数组,则此操作为无操作。
如果父 ID(或如果指定为数组,则任何一个父 ID)实际上并不对应于现有的持久化记录,则其确切行为取决于此关联的类型
同样,如果其中一个子 ID 实际上并不对应于现有的持久化记录,则
如果父记录的集合已经包含这些子记录中的一个或多个作为成员,则出于性能原因,这些成员关系可能会再次被跟踪(例如,在数据库的连接表中存储多次)。在大多数情况下,这没问题,因为它通常不会影响将来的查询(例如,在填充相关父记录的集合时,重复跟踪的关系不会导致子记录被列出多次)。如果确实需要防止重复的连接表记录,则有一种简单的方法可以解决此问题——假设您使用的是 MySQL 或 PostgreSQL 等关系数据库,则可以在连接表上创建多列索引。这样做会导致类似的查询导致 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 的则不会。