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?