如何在 typeorm 中创建关系的正确方法是什么?
What is the correct way how to create relation in 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
与 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;
代码有效,但我收到打字稿错误 Type 'string' is not assignable to type 'Promise<ProviderEntity>'.
。插入这个的正确方法是什么?
通用实体 class 仅包含 ID
@PrimaryGeneratedColumn('uuid')
id: string;
我相信通过关系 ID 关联事物,而不是完整的关系对象,您需要将关系 ID 添加到您的界面:
@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);
感谢@alex-wayne 向我指出了这个问题。作为参考,他提出的方法很可能源自核心贡献者 pleerock 的github issue. More precisely this answer。
另外,我个人比较喜欢first approach。实际上,除了使用 create
方法:
const content = 'mockContent';
const providerId = '5be045b1-ef49-4818-b69f-a45c0b7e53';
const provider = new Provider();
provider.id = providerId;
const item = this.itemRepository.craete({ content, provider })
await this.repository.save(item);
我有两个实体:
@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
与 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;
代码有效,但我收到打字稿错误 Type 'string' is not assignable to type 'Promise<ProviderEntity>'.
。插入这个的正确方法是什么?
通用实体 class 仅包含 ID
@PrimaryGeneratedColumn('uuid')
id: string;
我相信通过关系 ID 关联事物,而不是完整的关系对象,您需要将关系 ID 添加到您的界面:
@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);
感谢@alex-wayne 向我指出了这个问题。作为参考,他提出的方法很可能源自核心贡献者 pleerock 的github issue. More precisely this answer。
另外,我个人比较喜欢first approach。实际上,除了使用 create
方法:
const content = 'mockContent';
const providerId = '5be045b1-ef49-4818-b69f-a45c0b7e53';
const provider = new Provider();
provider.id = providerId;
const item = this.itemRepository.craete({ content, provider })
await this.repository.save(item);