node.js - TypeORM:自定义多对多关系
问题描述
我正在使用 Nest.js、TypeORM 和 PostgreSQL,我有两个具有多对多关系的实体(产品和石头),基于我自己的业务项目,我必须在多对多表中添加一个额外的列(product_stone),但我的解决方案有一些问题,起初我尝试用一组石头创建一个产品:
"stones": [
{"id": 1,"count":1},
{"id": 2,"count": 3}
]
之后,我尝试通过更新将计数添加到 product_stone 表中,结果将是这样的: product_stone_table 直到这里一切正常,但是每次我重新启动服务器时,该额外列中的所有数据都会是设置为其默认值(空): product_stone_table
而且我还尝试不在 product_stone 表中将计数设置为 {nullable:true} 并在创建产品期间添加计数,但是当我想重新启动服务器时,我收到一个错误:
QueryFailedError: column "count" of relation "product_stone" contains null values
有人指导我吗?
产品实体.ts
@Entity()
export class Product extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@ManyToMany(() => Stone)
@JoinTable({
name: 'product_stone',
joinColumn: {
name: 'productId',
referencedColumnName: 'id',
},
inverseJoinColumn: {
name: 'stoneId',
referencedColumnName: 'id',
},
})
stones: Stone[];
}
石头实体.ts
@Entity()
export class Stone extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
}
product_stone.entity.ts
@Entity('product_stone')
export class ProductStone extends BaseEntity {
@Column({ nullable: true })
count: number;
@Column()
@IsNotEmpty()
@PrimaryColumn()
productId: number;
@Column()
@IsNotEmpty()
@PrimaryColumn()
stoneId: number;
}
解决方案
我认为您不能像这样在多对多表上定义自定义属性。
从文档:
如果您需要在多对多关系中具有其他属性,则必须自己创建一个新实体
在您的情况下,这意味着您将不得不这样做:
// product_stone.entity.ts
@Entity()
export class ProductToStone {
@PrimaryGeneratedColumn()
public id: number;
@Column()
public productId: number;
@Column()
public stoneId: number;
@Column()
public count: number;
@ManyToOne(() => Product, product => product.productToStone)
public product: Product;
@ManyToOne(() => Stone, stone => stone.productToStone)
public stone: Stone;
}
// product.entity.ts
...
@OneToMany(() => ProductToStone, productToStone => postToCategory.product)
public productToStone!: PostToCategory[];
// stone.entity.ts
...
@OneToMany(() => ProductToStone, postToCategory => postToCategory.stone)
public postToCategories!: PostToCategory[];
推荐阅读
- reactjs - 为什么 React Js 中的 props 中用户数据为空?
- visual-studio - vc++ 迁移,从 Visual Studio (vc++) 6 到 Visual Studio 2019(vc++)
- azure-devops - 是否可以在 Azure DevOps 中的每 4 次提交时触发自动构建?
- javascript - JavaScript 使用 Next.js 路由器保留查询格式
- javascript - Vue 3 模板根只需要一个元素
- firebase - 在firebase中查询多个字段的最佳方法
- c# - 如何制作类似列表的结构
? - scala - 如何在 scala 中使用超过 22 个参数进行字符串插值
- pytorch - Pytorch - 重复损失
- android - 将应用操作与 Android 切片集成 - 延迟内容不会从第二个命令刷新