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=].