Typeorm关系-按ID保存

时间:2020-03-07 20:46:38

标签: nestjs typeorm

我一直对关系感到困惑,因为我习惯用id来保存关系,而我发现的文档和示例建议获取整个对象并改为使用它(这并不奇怪吗?)< / p>

我在github上发现了这个问题,解决了这个问题(https://github.com/typeorm/typeorm/issues/447),他们建议使用仅具有id属性的对象,但这是从2017年开始的。这是一个好方法吗?而且它仍然是唯一的方法吗? (我觉得很me脚)

async create( @Body() product: Product) {
    product.category = <any>{ id: product.category };
    return { payload: await this.repository.persist(product) };
}

另一建议将列命名为categoryId,它将按预期方式工作(用id代替object),但是为什么?这个名字和那个有什么关系?

@Entity()
class Product {

     @Column({ type: "int", nullable: true })
     categoryId: number;

     @ManyToOne(type => Category)
     @JoinColumn({ name: "categoryId" })
     category: Category;

}

我只是感到困惑,请帮助^ _ ^

1 个答案:

答案 0 :(得分:3)

这不是很奇怪吗?

取决于您的想法,但是,我还喜欢能够仅设置ID,而不是获取整个相关实体。

这是个好方法吗?而且它仍然是唯一的方法吗?

我也正在弄清打字错误。我发现您可以做到:

product.category = <any>3;
// or
product['category' as any] = 3;
repository.save(product) // I don't know how you have the persist() method.

,并且在您的情况下,product.categoryId列将设置为3。如果categoryId是外键,并且设置了不存在的ID,则将出现外键错误,就像您应该的那样。

但是,这样,ts仍会认为product.category的类型为Category。您也可以将category属性指定为Category | number。但是随后您将不得不在所有烦人的地方进行类型检查。我已经对此进行了一些测试,但是我不确定这是否会引起一些毫无疑问的错误。

名字和那个有什么关系?

好吧,您提供的选项是定义2个属性:category是关系,而categoryId是列。属性categoryId应该像表中的列一样命名,但是您也可以在name: 'actual_name'装饰器中传递@Column。我不知道如果将columnIdcolumn属性都设置为不同的ID,会发生什么情况。

相关问题