【问题标题】:Why is delete being called after updating entity in typeorm?为什么在 typeorm 中更新实体后调用 delete?
【发布时间】:2020-10-18 22:25:56
【问题描述】:

当用户创建组织时,我会在创建后检查并更新活动组织。我将从 JWT 策略中检索到的经过身份验证的用户对象与创建的组织一起传递给 updateActiveOrganization 方法。这样做会创建以下 SQL 代码。我可以通过使用 queryBuilder 或只是获取用户的新实例来解决这个问题,但我想避免另一个数据库查询发生这种情况。无论如何我可以使用已经创建的实例来实现这一点吗?我没有创建任何我可以看到的约束,除非 ORM 正在创建我看不到的约束。谢谢。

query: INSERT INTO `organization`(`id`, `name`, `location`, `avatar`, `slug`, `createdAt`, `ownerId`) VALUES (DEFAULT, ?, DEFAULT, DEFAULT, ?, DEFAULT, ?) -- PARAMETERS: ["test",1]
query: SELECT `Organization`.`id` AS `Organization_id`, `Organization`.`createdAt` AS `Organization_createdAt` FROM `organization` `Organization` WHERE `Organization`.`id` = ? -- PARAMETERS: [22]
query: INSERT INTO `organization_members`(`organizationId`, `userId`) VALUES (?, ?) -- PARAMETERS: [22,1]
query: COMMIT
query: SELECT `User`.`id` AS `User_id`, `User`.`firstname` AS `User_firstname`, `User`.`surname` AS `User_surname`, `User`.`email` AS `User_email`, `User`.`createdAt` AS `User_createdAt`, `User`.`activeOrganizationId` AS `User_activeOrganizationId` FROM `user` `User` WHERE `User`.`id` IN (?) -- PARAMETERS: [1]
query: SELECT `User_organizations_rid`.`organizationId` AS `organizationId`, `User_organizations_rid`.`userId` AS `userId` FROM `organization` `organization` INNER JOIN `organization_members` `User_organizations_rid` ON (`User_organizations_rid`.`userId` = ? AND `User_organizations_rid`.`organizationId` = `organization`.`id`) ORDER BY `User_organizations_rid`.`organizationId` ASC, `User_organizations_rid`.`userId` ASC -- PARAMETERS: [1]
query: START TRANSACTION
query: UPDATE `user` SET `activeOrganizationId` = ? WHERE `id` IN (?) -- PARAMETERS: [22,1]
query: DELETE FROM `organization_members` WHERE `organizationId` = ? AND `userId` = ? -- PARAMETERS: [22,1]
query: COMMIT

这是我无法弄清楚如何停止使用当前代码设置的部分。

query: START TRANSACTION
query: UPDATE `user` SET `activeOrganizationId` = ? WHERE `id` IN (?) -- PARAMETERS: [22,1]
query: DELETE FROM `organization_members` WHERE `organizationId` = ? AND `userId` = ? -- PARAMETERS: [22,1]
query: COMMIT

用户实体

export class User extends BaseEntity {    
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstname: string;

    @Column()
    surname: string;

    @Column({
        unique: true
    })
    email: string;
    @Column({ select: false })
    password: string;

    @CreateDateColumn()
    createdAt: Date;

    /** RELATIONS */
    @OneToOne(type => Organization)
    @JoinColumn({ name: 'activeOrganizationId' })
    activeOrganization: Organization;

    @ManyToMany(type => Organization, organization => organization.members)
    organizations: Organization[];
}

组织实体


@Entity()
export class Organization extends BaseEntity {
    
    @PrimaryGeneratedColumn()
    id: number;

    @Column({
        length: 80,
        unique: true,
    })
    name: string;

    @CreateDateColumn()
    createdAt: Date; 

    
    @ManyToOne(type => User)
    @JoinColumn()
    owner: User;

    @ManyToMany(type => User, user => user.organizations) 
    @JoinTable({ name: 'organization_members' })
    members: User[];
}  

更新代码

    async updateActiveOrganization(updateData: IUpdateActiveOrganization): Promise<void> {
        const { user, organization } = updateData;
        user.activeOrganization = organization;
        await user.save();
    }

【问题讨论】:

  • 我猜这是因为您在同一张表上定义了两个不同的关系。您不能在同一张桌子上同时拥有一对一和多对多。哦,你也有许多对一。 3 种不同的关系。
  • @noamsteiner 昨晚我刚刚使用 API 测试了多个用户,发现我打算将多对一关系放在活跃的组织上。我什至没有想过要回去检查是否是导致问题的原因。感谢您的评论!

标签: mysql nestjs typeorm


【解决方案1】:

看起来我现在找到了一个可以接受的解决方法。如果有更好的方法,请告诉我。

await this.userRepository.createQueryBuilder()
    .update()
    .set({
        activeOrganization: organization,
    })
    .where('user = :user', user);

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 2021-08-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2018-11-24
    • 2022-06-14
    相关资源
    最近更新 更多