【发布时间】: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 测试了多个用户,发现我打算将多对一关系放在活跃的组织上。我什至没有想过要回去检查是否是导致问题的原因。感谢您的评论!