Search code examples
typescriptentity-relationshiptypeorm

What is the correct way how to create relation in typeorm?


I have two entities:

@Entity({ name: 'provider' })
export class ProviderEntity extends GenericEntity {

    @Column()
    name: string;

    @Column()
    description: string;

    @OneToMany(() => ItemEntity, item => item.provider)
    items: Promise<ItemEntity[]>;

}

@Entity({ name: 'item' })
export class ItemEntity extends GenericEntity {

    @Column()
    content: string;

    @ManyToOne(() => ProviderEntity, provider => provider.items)
    provider: Promise<ProviderEntity>;

}

Provider object already exist in database and I would like to create item with realtion to provider.

My code is:

        const content = 'mockContent';
        const providerId = '5be045b1-ef49-4818-b69f-a45c0b7e53';
       
        const item = new ItemEntity();
        item.content = content;
        item.provider = providerId; // ERROR

        await this.repository.save(item);
        return item;

The code it works, but I am getting an typescript error Type 'string' is not assignable to type 'Promise<ProviderEntity>'.. What is the correct way how to insert this?


Generic entity class contains only id

@PrimaryGeneratedColumn('uuid')
id: string;

Solution

  • I believe to associate things by a relation ID, and not a full relation object, you need to add the relation ID to your interface:

    @ManyToOne(() => ProviderEntity, provider => provider.items)
    provider: Promise<ProviderEntity>;
    
    @Column()
    providerId: string
    

    providerId is the column TypeORM uses to keep track of the relation internally, you simply simply need to expose it publicly.

    And then you simply set that property:

    const item = new ItemEntity();
    item.content = content;
    item.providerId = providerId; // set providerId column directly.
    
    await this.repository.save(item);