node.js - Hur man frågar en egengjord join-tabell med många-till-många-relation i Typeorm?
Med hjälp av Typeorm skapade jag följande två databasentiteter, users och tenants, som är kopplade tvåvägs med hjälp av en egen gjord join-tabell, users_tenants. Anledningen till att jag använder en egen gjord join-tabell är eftersom jag vill utöka den med extra fält.
Entiteten användare:
@Entity('users')
export default class User extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
id!: string;
@Column({
length: 32,
nullable: false,
})
firstName!: string;
@Column({
length: 32,
nullable: false,
})
lastName!: string;
@OneToMany(() => UserTenant, (userTenant) => userTenant.user)
userTenants!: UserTenant[];
@CreateDateColumn({ type: 'timestamp with time zone' })
createdAt!: Date;
@UpdateDateColumn({ type: 'timestamp with time zone' })
updatedAt!: Date;
}
Entiteten tenants:
@Entity('tenants')
export default class Tenant extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
id!: string;
@Column({
length: 32,
nullable: false,
})
name!: string;
@Column({
length: 200,
nullable: false,
})
description!: string;
@OneToMany(() => UserTenant, (userTenant) => userTenant.tenant)
userTenants!: UserTenant[];
@CreateDateColumn({ type: 'timestamp with time zone' })
createdAt!: Date;
@UpdateDateColumn({ type: 'timestamp with time zone' })
updatedAt!: Date;
}
Den anpassade sammanfogningstabellen users_tenants:
@Entity('users_tenants')
@Index(['userId', 'tenantId'], { unique: true })
export default class UserTenant extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
id!: string;
@Column()
userId!: string;
@Column()
tenantId!: string;
@ManyToOne(() => User, (user) => user.userTenants, {
nullable: false,
eager: true,
onDelete: 'CASCADE',
})
@JoinColumn({ name: 'userId' })
user!: User;
@ManyToOne(() => Tenant, (tenant) => tenant.userTenants, {
nullable: false,
eager: true,
onDelete: 'CASCADE',
})
@JoinColumn({ name: 'tenantId' })
tenant!: Tenant;
@CreateDateColumn({ type: 'timestamp with time zone' })
createdAt!: Date;
@UpdateDateColumn({ type: 'timestamp with time zone' })
updatedAt!: Date;
}
Mitt mål är att fråga databasen vilket resulterar i en struktur som denna: tenant ---> lista över användare. Så jag försöker fråga databasen med följande kod:
const tenant = await database.collections.Tenant?.findOne({
relations: ['userTenants', 'userTenants.user'],
where: {
id,
},
});
Vilket resulterar i följande utdata:
{
"id": "97754b60-ca22-47d7-b611-49ac4d81e4af",
"name": "test",
"description": "test description",
"createdAt": "2021-02-01T19:20:43.185Z",
"updatedAt": "2021-02-01T19:20:43.185Z",
"userTenants": [
{
"id": "6b32e4de-23f4-4cef-bd1d-34359e7d9f9b",
"userId": "6350db80-770b-4997-8ba4-d2f194f7b16f",
"tenantId": "97754b60-ca22-47d7-b611-49ac4d81e4af",
"createdAt": "2021-02-02T17:45:41.660Z",
"updatedAt": "2021-02-02T17:45:41.660Z",
"user": {
"id": "6350db80-770b-4997-8ba4-d2f194f7b16f",
"firstName": "User",
"lastName": "Userlast",
"createdAt": "2021-02-02T17:45:07.372Z",
"updatedAt": "2021-02-02T17:45:07.372Z"
},
"tenant": {
"id": "97754b60-ca22-47d7-b611-49ac4d81e4af",
"name": "test",
"description": "test description",
"createdAt": "2021-02-01T19:20:43.185Z",
"updatedAt": "2021-02-01T19:20:43.185Z"
}
}
]
}
Problemet med detta resultat är att en lista över användar-tenant-relationer returneras och inte en lista över användare som tillhör den tenanten. När detta skulle vara en enkel en till många-relation kan jag ta emot resultatet på följande sätt:
{
"id": "97754b60-ca22-47d7-b611-49ac4d81e4af",
"name": "test",
"description": "test description",
"createdAt": "2021-02-01T19:20:43.185Z",
"updatedAt": "2021-02-01T19:20:43.185Z",
"users": [
{
"id": "6350db80-770b-4997-8ba4-d2f194f7b16f",
"firstName": "User",
"lastName": "Userlast",
"createdAt": "2021-02-02T17:45:07.372Z",
"updatedAt": "2021-02-02T17:45:07.372Z"
}
]
}
Fråga: Hur måste jag utföra frågan (med hjälp av Typeorm) så att data i en egenhändigt skapad dubbelriktad kopplingstabell returneras som strukturen ovan?