首页 > 解决方案 > 如何在 typeorm 中建立 OneToMany 关系?

问题描述

我有一个用户实体,它有一个 userRoles 数组作为数据成员。用户存储在数据库中名为 users 的表中,而 user_roles 存储在名为 user_role_mapping 的表中。我想与 typeorm 建立一对多的关系,这样当我在数据库中保存用户时,它也会将相应的 userRoles 保存在各自的表中。我无法让它工作。

这是我的用户实体

@Entity("users",{schema:"Cellphones" } )
@Index("net_id",["netId",],{unique:true})
export class User {

    @PrimaryGeneratedColumn({
        type:"int", 
        name:"id"
        })
    id: number;


    @Column("varchar",{ 
        nullable:false,
        unique: true,
        length:20,
        name:"net_id"
        })
    netId: string;


    @Column("varchar",{ 
        nullable:true,
        length:20,
        name:"employee_id"
        })
    employeeId: string | null;


    @Column("varchar",{ 
        nullable:false,
        length:50,
        name:"first_name"
        })
    firstName: string;


    @Column("varchar",{ 
        nullable:false,
        length:50,
        name:"last_name"
        })
    lastName: string;


    @Column("varchar",{ 
        nullable:true,
        length:50,
        name:"title"
        })
    title: string | null;


    @Column("tinyint",{ 
        nullable:false,
        width:1,
        name:"active"
        })
    active: boolean;


    @Column("varchar",{ 
        nullable:true,
        length:100,
        name:"email"
        })
    email: string | null;


    @Column("varchar",{ 
        nullable:true,
        length:20,
        name:"phone"
        })
    phone: string | null;


    @Column("date",{ 
        nullable:true,
        name:"term_date"
        })
    termDate: Date | null;


    @Column("varchar",{ 
        nullable:true,
        length:10,
        name:"term_department"
        })
    termDepartment:string | null;


    @Column("date",{ 
        nullable:true,
        name:"retire_date"
        })
    retireDate: Date | null;


    @Column("date",{ 
        nullable:false,
        name:"last_login"
        })
    lastLogin: Date;


    @Column("varchar",{ 
        nullable:false,
        length:50,
        name:"employee_status"
        })
    employeeStatus:string;


    @Column("varchar",{ 
        nullable:false,
        length:50,
        name:"department"
        })
    department:string;


    @Column("varchar",{ 
        nullable:true,
        length:10,
        name:"pay_group"
        })
    payGroup:string | null;


    @Column("datetime",{ 
        nullable:true,
        name:"updated"
        })
    updated:Date | null;


    @Column("int",{ 
        nullable:true,
        name:"updated_by"
        })
    updatedBy:number | null;


    @Column("date",{ 
        nullable:true,
        name:"inactivated"
        })
    inactivated:Date | null;


    @Column("int",{ 
        nullable:true,
        name:"inactivated_by"
        })
    inactivatedBy:number | null;

    @OneToMany(type => UserRoleMapping, userRoleMapping => userRoleMapping.userId)
    userRoles: UserRoleMapping[];
}

这是我的 UserRoleMapping 实体:

@ManyToOne(type => User, user => user.userRoles)
@Entity("user_role_mapping",{schema:"Cellphones" } )
export class UserRoleMapping {

    constructor(id: number, userId: number, roleId: number) {}

    @PrimaryGeneratedColumn({
        type:"int",
        name:"id"
        })
    id: number;


    @Column({
        type:"int",
        name:"user_id"
        })
    userId: number;

    @Column({
        type:"int",
        name:"role_id"
        })
    roleId: number;
}

用户表如下所示:

在此处输入图像描述

下面是 user_role_mapping 表的样子:

在此处输入图像描述

请注意,名称以 old_ 开头的任何列仅用于数据迁移目的,与此项目无关。

标签: mysqltypescripttypeorm

解决方案


这是使关系起作用的代码。

在用户中:

@OneToMany(type => UserRoleMapping, userRoleMapping => userRoleMapping.user, 
    { eager: true, cascade: true})
userRoles: UserRoleMapping[];

在用户角色映射中:

@ManyToOne(type => User, user => user.userRoles)
@JoinColumn({ name: "user_id", referencedColumnName: "id"})
user: User;

关键是将关系装饰器移动到用户字段并定义@JoinColumn。


推荐阅读