首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TypeORM更新多对多关系的所有记录

TypeORM更新多对多关系的所有记录
EN

Stack Overflow用户
提问于 2020-01-16 06:00:27
回答 2查看 9.6K关注 0票数 2

我在ChannelUser之间有一种多对多的关系,它用于向订阅了某个通道的用户发送电子邮件通知。我正在开发一个功能,其中一个通道被分解为另一个通道,但我不知道如何将所有通知从分解通道转移到目标通道。

代码语言:javascript
运行
复制
@Entity()
export class User {
    @PrimaryColumn()
    id: string

    @Column()
    createdAt: Date

    @Column()
    updatedAt: Date

    @Column()
    email: string

    @ManyToMany(_type => Channel)
    @JoinTable()
    notifications: Channel[]
}

@Entity()
export class Channel {
    @PrimaryColumn()
    id: string

    @Column()
    createdAt: Date

    @Column()
    updatedAt: Date
}

async function transferNotifications(from: unknown, to: unknown): Promise<void> {
    //?
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-16 18:12:32

您至少有两个选项:

1.使用EntityManager

首先,获取与notification具有已解析关系的所有User实体。然后从所有获取的Channel实体的notification属性中删除旧的(已分解的) User实体,并将新的Channel实体添加到该数组中(如果它以前包含旧实体的话)。这将删除相应的连接表行,并向新通道添加一个新的连接表行。

明显的缺点是,连接将在所有行的三个表上执行,所有结果都加载到应用程序内存中。因此,对于较大的表来说,这不一定是一个好的解决方案。

2.使用QueryBuilder

一种更好的方法是通过添加自定义连接表实体来自己构建连接表。然后使用QueryBuilder将旧通道的旧外键替换为新通道的id。

代码语言:javascript
运行
复制
getRepository(UserChannel).createQueryBuilder()
   .update()
   .set({ channelId: '<new channel id>' })
   .where(`channelId = :channelId`, { channelId: `<old channel id>`})
   .execute();
代码语言:javascript
运行
复制
@Entity()
export class User {

    @PrimaryColumn()
    id: string

    @Column()
    createdAt: Date

    @Column()
    updatedAt: Date

    @Column()
    email: string

    @OneToMany(type => UserChannel)
    userChannels: UserChannel[]
}

@Entity()
export class UserChannel {

    @ManyToOne(type => User)
    user!: User;

    @Column({ primary: true })
    userId!: string;


    @ManyToOne(type => Channel)
    channel!: channel;

    @Column({ primary: true })
    channelId!: string;
}


@Entity()
export class Channel {

    @PrimaryColumn()
    id: string

    @Column()
    createdAt: Date

    @Column()
    updatedAt: Date
}
票数 4
EN

Stack Overflow用户

发布于 2020-11-25 16:36:35

如果您正在使用NodeJs。您可以使用promises进行批量更新、删除或其他任何操作。

您需要做的是将所有更新map到数组,然后使用Promise.all解析它们。

新的更新。

代码语言:javascript
运行
复制
updates = [{ id: 1, name: "Channel 1" }, { id: 2, name: "Channel 2"}];

批量更新代码

代码语言:javascript
运行
复制
let promises = updates.map(update =>  { 
      let query = {id: update.id};
          delete update.id;
          return channelRepository
              .update({id update.id}, update) 
         });
return await Promise.all(promises);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59760187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档