如何在TypeORM中实现UserToken表与用户ID的关联连接?
使用TypeORM建立UserToken与User表的关联
核心思路
根据你的业务场景(验证邮件的token),推荐配置一对一关联(单用户对应唯一有效验证token),如果需要支持多历史token则用一对多,下面分别给出实现方案:
1. 一对一关联方案(单用户单有效token)
修改UserToken实体
保留user_id作为主键+外键,添加TypeORM关联装饰器绑定UserEntity:
import { Entity, PrimaryColumn, Column, OneToOne, JoinColumn } from "typeorm"; import { UserEntity } from "./UserEntity"; import { IsUUID, IsNotEmpty, IsString } from "class-validator"; @Entity({name: "user_token"}) export class UserToken { @PrimaryColumn({name: "user_id"}) @IsUUID() @IsNotEmpty() userId: string; // 关联UserEntity,指定外键为user_id @OneToOne(() => UserEntity, user => user.userToken) @JoinColumn({ name: "user_id" }) user: UserEntity; @Column({name: "token"}) @IsString() @IsNotEmpty() token!: string; }
修改UserEntity实体
添加反向关联,支持从用户对象直接获取对应token:
import { Entity, PrimaryColumn, OneToOne } from "typeorm"; import { UserToken } from "./UserToken"; import { IsUUID, IsNotEmpty } from "class-validator"; @Entity({name: "users"}) export class UserEntity { @PrimaryColumn({name: "id"}) @IsUUID() @IsNotEmpty() id!: string; // 反向关联UserToken @OneToOne(() => UserToken, userToken => userToken.user) userToken: UserToken; }
2. 一对多关联方案(支持多历史token)
如果需要保留用户的多份验证token(比如过期token),调整如下:
修改UserToken实体
新增自增主键,将user_id设为普通外键:
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from "typeorm"; import { UserEntity } from "./UserEntity"; import { IsUUID, IsNotEmpty, IsString } from "class-validator"; @Entity({name: "user_token"}) export class UserToken { @PrimaryGeneratedColumn() id: number; @Column({name: "user_id"}) @IsUUID() @IsNotEmpty() userId: string; @ManyToOne(() => UserEntity, user => user.userTokens) @JoinColumn({ name: "user_id" }) user: UserEntity; @Column({name: "token"}) @IsString() @IsNotEmpty() token!: string; // 可选:添加过期时间字段,更贴合验证场景 @Column({name: "expires_at"}) expiresAt: Date; }
修改UserEntity实体
调整为一对多的反向关联:
import { Entity, PrimaryColumn, OneToMany } from "typeorm"; import { UserToken } from "./UserToken"; import { IsUUID, IsNotEmpty } from "class-validator"; @Entity({name: "users"}) export class UserEntity { @PrimaryColumn({name: "id"}) @IsUUID() @IsNotEmpty() id!: string; @OneToMany(() => UserToken, userToken => userToken.user) userTokens: UserToken[]; }
使用示例
关联配置完成后,可直接通过关联关系查询或保存数据:
// 查询用户及其关联的token const userWithToken = await userRepository.findOne({ where: { id: "用户UUID" }, relations: ["userToken"] // 一对多场景用"userTokens" }); // 保存新的验证token const newToken = new UserToken(); newToken.token = "生成的随机验证字符串"; newToken.user = userEntity; // 直接关联用户对象 await userTokenRepository.save(newToken);
内容的提问来源于stack exchange,提问作者user23117399
相关产品推荐
相关产品推荐

