typeorm:保存具有多对多关系 ID 的实体
typeorm: saving an entity with many-to-many relationship ids
是否可以保存具有多对多关系 ID 的实体?
假设我有以下 Project
与用户组具有多对多关系的实体 table。
@Entity()
export class Project extends BaseEntity {
@Column({ type: 'varchar', length: 255 })
name: string
@RelationId((project: Project) => project.userGroups)
userGroupIds: number[]
@ManyToMany(type => UserGroup, userGroup => userGroup.projects)
@JoinTable()
userGroups: UserGroup[]
}
由于用户组 table 的 ID 通过 @RelationId
装饰器映射到项目 class 的 userGroupIds
属性,我想我可以保存一个具有 userGroupIds 的新项目实体,如下所示:
let prj = new Project()
prj.name = 'foo'
prj.userGroupIds = [1, 2, 3]
prj.save()
但上面的代码只创建了一个项目记录...(没有在项目上创建记录 - userGroups 多对多关系table)
假设我们
@Entity()
export class Project extends BaseEntity {
@Column({ type: 'varchar', length: 255 })
name: string
@RelationId((project: Project) => project.userGroups)
userGroupIds: number[]
@ManyToMany(type => UserGroup, userGroup => userGroup.projects)
@JoinTable()
userGroups: UserGroup[]
}
坚持,我可以
let prj = new Project()
prj.name = 'foo'
Number a = // create a user group here
prj.userGroupIds.add(a)
prj.save()
after persist, you will see a record in the table project - userGroups
|project| |projet-usergroup| |usergroup|
--------- ------------------ -----------
|id | |idproj|idusergrp| |idusergrp|
|1 | |1 | 1 | | 1 |
after all you will have something like that
如果要将现有实体添加到新实体,可以按如下方式进行(使用示例中的相同代码)
鉴于:
@Entity()
export class Project extends BaseEntity {
@Column({ type: 'varchar', length: 255 })
name: string
@RelationId((project: Project) => project.userGroups)
userGroupIds: number[]
@ManyToMany(type => UserGroup, userGroup => userGroup.projects)
@JoinTable()
userGroups: UserGroup[]
}
要添加新条目:
idsToAdd = [1,2,3] // Assume these already exist
let prj = new Project()
prj.name = 'foo'
prj.userGroupIds = idsToAdd.map(id => ({...new UserGroup(), id})) // Convert each of the ids into the proper entity.
prj.save() // Typeorm will ignore the other fields and only update the Ids, as you expect.
另一种方法是 map
每个 id
到 {id: id}
,但打字稿可能会抱怨该映射,因为 id
中可能还需要其他字段=23=].
是否可以保存具有多对多关系 ID 的实体?
假设我有以下 Project
与用户组具有多对多关系的实体 table。
@Entity()
export class Project extends BaseEntity {
@Column({ type: 'varchar', length: 255 })
name: string
@RelationId((project: Project) => project.userGroups)
userGroupIds: number[]
@ManyToMany(type => UserGroup, userGroup => userGroup.projects)
@JoinTable()
userGroups: UserGroup[]
}
由于用户组 table 的 ID 通过 @RelationId
装饰器映射到项目 class 的 userGroupIds
属性,我想我可以保存一个具有 userGroupIds 的新项目实体,如下所示:
let prj = new Project()
prj.name = 'foo'
prj.userGroupIds = [1, 2, 3]
prj.save()
但上面的代码只创建了一个项目记录...(没有在项目上创建记录 - userGroups 多对多关系table)
假设我们
@Entity()
export class Project extends BaseEntity {
@Column({ type: 'varchar', length: 255 })
name: string
@RelationId((project: Project) => project.userGroups)
userGroupIds: number[]
@ManyToMany(type => UserGroup, userGroup => userGroup.projects)
@JoinTable()
userGroups: UserGroup[]
}
坚持,我可以
let prj = new Project()
prj.name = 'foo'
Number a = // create a user group here
prj.userGroupIds.add(a)
prj.save()
after persist, you will see a record in the table project - userGroups
|project| |projet-usergroup| |usergroup|
--------- ------------------ -----------
|id | |idproj|idusergrp| |idusergrp|
|1 | |1 | 1 | | 1 |
after all you will have something like that
如果要将现有实体添加到新实体,可以按如下方式进行(使用示例中的相同代码)
鉴于:
@Entity()
export class Project extends BaseEntity {
@Column({ type: 'varchar', length: 255 })
name: string
@RelationId((project: Project) => project.userGroups)
userGroupIds: number[]
@ManyToMany(type => UserGroup, userGroup => userGroup.projects)
@JoinTable()
userGroups: UserGroup[]
}
要添加新条目:
idsToAdd = [1,2,3] // Assume these already exist
let prj = new Project()
prj.name = 'foo'
prj.userGroupIds = idsToAdd.map(id => ({...new UserGroup(), id})) // Convert each of the ids into the proper entity.
prj.save() // Typeorm will ignore the other fields and only update the Ids, as you expect.
另一种方法是 map
每个 id
到 {id: id}
,但打字稿可能会抱怨该映射,因为 id
中可能还需要其他字段=23=].