gpt4 book ai didi

TypeORM @JoinTable() 如何指定自定义连接列?

转载 作者:行者123 更新时间:2023-12-03 08:04:23 33 4
gpt4 key购买 nike

这是我的示例数据模型

enter image description here

我已经声明了以下类:

@Entity({
name: 'user'
})
export class User {
@Column({ type: 'int4' })
@PrimaryColumn()
userid: number

@Column({name: 'name', type: 'varchar', length: 30})
name: string

@Column({name: 'age', type: 'int2'})
age: number

@ManyToMany(() => Department, (department)=> department.users)
@JoinTable({
name: 'department_user'
})
departments: Department[]
}

@Entity({ name: 'department' })
export class Department {

@Column({ type: 'int2' })
@PrimaryColumn()
departmentid: number

@Column({type: 'varchar', length: 50})
title: string

@Column({type:'text'})
notes: string

@ManyToMany(() => User, (user)=> user.departments)
@JoinTable({ name: 'department_user' })
users: User[]
}

每当我运行该应用程序时,它都会创建 departmentDepartmentIduserUserId 列,而不使用相应联接表中的列。如何告诉 typeorm 仅使用连接表中预定义的连接列?

更新 2(如 @suvantorw 提到的)

我使用以下语句重新创建了连接表:

create table department_user(
departmentid integer not null,
userid integer not null);

alter table department_user add constraint fk_dept_dept foreign key (departmentid) references department(departmentid);
alter table department_user add constraint fk_dept_user foreign key (userid) references "user"(userid);
alter table department_user add constraint pk_dept_user primary key (departmentid, userid);

并修改了这样的实体:

用户

  @ManyToMany(() => Department, (department)=> department.users)
@JoinTable({
name: 'department_user',
joinColumn: { name: 'userid' },
inverseJoinColumn: { name: 'departmentid' }
})
departments: Department[]
}

部门

  @ManyToMany(() => User, (user)=> user.departments)
@JoinTable({
name: 'department_user',
joinColumn: { name: 'departmentid' },
inverseJoinColumn: { referencedColumnName: 'userid' }
})
users: User[]
}

它运行时没有错误,但是当它运行时,表结构被修改为这样 modified table structure

正如您所看到的,,y 外键约束消失了,并且创建了新的外键约束。知道我在这里做错了什么吗?

更新3

最后我修改了类,如下所示,现在 TypeORM 接受关系并且不创建自己的关系。解决这个问题是一次非常痛苦的经历,而且关于这个装饰器的文档也没有说太多。

用户

  @ManyToMany(() => Department, (department)=> department.users)
@JoinTable({
name: 'department_user',
joinColumn: {
name: 'userid',
foreignKeyConstraintName: 'fk_dept_user'
},
inverseJoinColumn: {
referencedColumnName: 'departmentid',
name: 'departmentid',
foreignKeyConstraintName: 'fk_dept_dept'
}
})
departments: Department[]
}

部门

@ManyToMany(() => User, (user)=> user.departments)
@JoinTable({
name: 'department_user',
joinColumn: {
name: 'departmentid',
foreignKeyConstraintName: 'fk_dept_dept'
},
inverseJoinColumn: {
referencedColumnName: 'userid',
name: 'userid',
foreignKeyConstraintName: 'fk_dept_user'
}
})
users: User[]
}

最佳答案

您可以指定连接列名称和反向连接列名称。像这样的东西应该适合你:

@ManyToMany(() => Department, (department)=> department.users)
@JoinTable({
name: 'department_user',
joinColumn: { name: 'userid' },
inverseJoinColumn: { name: 'departmentid' }
})
departments: Department[]

关于TypeORM @JoinTable() 如何指定自定义连接列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72879395/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com