我一直对关系感到困惑,因为我习惯用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;
}
我只是感到困惑,请帮助^ _ ^
答案 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
。我不知道如果将columnId
和column
属性都设置为不同的ID,会发生什么情况。