You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 03:57:17