Как правильно создать отношение в typeorm?

#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);