#typescript #entity-relationship #typeorm
#typescript #сущность-отношение #typeorm
Вопрос:
У меня есть две сущности:
@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
объект уже существует в базе данных, и я хотел бы создать item
с помощью realtion to provider
.
Мой код:
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;
Код работает, но я получаю сообщение об ошибке typescript Type 'string' is not assignable to type 'Promise<ProviderEntity>'.
. Как правильно вставить это?
Общий класс сущности содержит только идентификатор
@PrimaryGeneratedColumn('uuid')
id: string;
Ответ №1:
Я считаю, что для связывания объектов с идентификатором отношения, а не с полным объектом отношения, вам нужно добавить идентификатор отношения в свой интерфейс:
@ManyToOne(() => ProviderEntity, provider => provider.items)
provider: Promise<ProviderEntity>;
@Column()
providerId: string
providerId
используется ли столбец TypeORM для отслеживания отношения внутри, вам просто нужно его публично раскрыть.
А затем вы просто устанавливаете это свойство:
const item = new ItemEntity();
item.content = content;
item.providerId = providerId; // set providerId column directly.
await this.repository.save(item);
Ответ №2:
Спасибо @alex-wayne, который указал мне на этот вопрос. Для справки, подход, который он предложил, скорее всего, возник из этой проблемы с github. Точнее, этот ответ от pleerock, основного участника.
Более того, я лично предпочитаю первый подход. На практике, в дополнение к использованию create
метода:
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);