typescript - Hva er den riktige måten å lage relasjon på i typeorm?
Jeg har to enheter:
@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-objektet finnes allerede i databasen, og jeg vil lage et item med tilknytning til provider.
Koden min er:
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;
Koden fungerer, men jeg får en Typescript-feil Type 'string' is not assignable to type 'Promise<ProviderEntity>'.. Hva er den riktige måten å sette inn dette på?
Generisk enhetsklasse inneholder kun id
@PrimaryGeneratedColumn('uuid')
id: string;
Svar #1
Jeg tror for å knytte ting ved en relasjons-ID, og ikke et fullstendig relasjonsobjekt, må du legge til relasjons-ID-en i grensesnittet ditt:
@ManyToOne(() => ProviderEntity, provider => provider.items)
provider: Promise<ProviderEntity>;
@Column()
providerId: string
providerId er kolonnen TypeORM bruker for å holde styr på relasjonen internt, du trenger bare å eksponere den offentlig.
Og så setter du enkelt den egenskapen:
const item = new ItemEntity();
item.content = content;
item.providerId = providerId; // set providerId column directly.
await this.repository.save(item);
Svar #2
Takk til @alex-wayne som påpekte dette spørsmålet for meg. Til referanse, tilnærmingen han foreslo stammer mest sannsynlig fra denne GitHub-saken. Mer presist dette svaret fra pleerock, hovedbidragsyteren.
Dessuten foretrekker jeg personlig den første tilnærmingen. I praksis, med tillegg av å bruke create-metoden:
const content = 'mockContent';
const providerId = '5be045b1-ef49-4818-b69f-a45c0b7e53';
const provider = new Provider();
provider.id = providerId;
const item = this.itemRepository.create({ content, provider })
await this.repository.save(item);
