mysql - 如何在 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_ 开头的任何列仅用于数据迁移目的,与此项目无关。
解决方案
这是使关系起作用的代码。
在用户中:
@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。
推荐阅读
- python - 从父类访问命名元组中的派生属性
- bash - 如果匹配行,SED 搜索并替换超过 1 个模式
- mysql - 显示 2013 年创建的所有项目
- c# - 缺少程序集引用
- data-binding - Polymer 3 中的属性更改后如何更新文本元素?
- excel - 将表格从电子邮件正文粘贴到 Excel 工作表
- javascript - 调用另一个组件内部的方法 - React Js
- android - 每次单击按钮时如何动态删除edittext
- facebook - FB Graph API Response Paging Next 包含 access_token
- ruby - Spreadsheet::Workbook.new 创建 .xls 而不是 xlsx