我使用 PostgreSQL。我有三个实体:产品、仓库和 ProductOnWarehouse。 Product 描述产品、其价格和名称,Warehouse 描述仓库、其坐标和名称,ProductOnWarehouse 描述特定仓库中的特定产品,包括该仓库特有的价格和数量。 它们具有以下形式:
//Product.ts
import { Entity, Column, PrimaryGeneratedColumn, OneToMany } from "typeorm"
import ProductOnWarehouse from "./ProductOnWarehouse"
@Entity({ name: "Product" })
export default class Product {
@PrimaryGeneratedColumn()
id: number
@Column({ type: "varchar", length: "80" })
name: string
@Column()
price: number
@OneToMany(
() => ProductOnWarehouse,
(productOnWarehouse) => productOnWarehouse.product
)
productOnWarehouses: ProductOnWarehouse[]
}
//Warehouse.ts
import { Entity, Column, PrimaryGeneratedColumn, OneToMany } from "typeorm"
import ProductOnWarehouse from "./ProductOnWarehouse"
@Entity({ name: "Warehouse" })
export default class Warehouse {
@PrimaryGeneratedColumn()
id: number
@Column({ type: "varchar", length: "80" })
name: string
@Column("real")
lat: number
@Column("real")
lon: number
@OneToMany(
() => ProductOnWarehouse,
(productOnWarehouse) => productOnWarehouse.warehouse
)
productOnWarehouses: ProductOnWarehouse[]
}
//ProductOnWarehouse.ts
import { Entity, Column, PrimaryGeneratedColumn, ManyToOne, JoinColumn } from "typeorm"
import Product from "./Product.entity"
import Warehouse from "./Warehouse.entity"
@Entity({ name: "ProductOnWarehouse" })
export default class ProductOnWarehouse {
@PrimaryGeneratedColumn()
id: number
@ManyToOne(() => Product, (product) => product.productOnWarehouses)
@JoinColumn({ name: "productId" })
product: Product
@ManyToOne(() => Warehouse, (warehouse) => warehouse.productOnWarehouses)
@JoinColumn({ name: "warehouseId" })
warehouse: Warehouse
@Column()
price: number
@Column()
amount: number
}
当我想在 ProductOnWarehouse 表中创建或查找条目时,我发现 where 条件不需要 id,而是 Product 和 Warehouse 类的实例:
this.storedProductsRepository.findOneBy({product: /**requires a Product instance!*/, warehouse: /**requires a Warehouse instance!*/})
情况与创建新的 ProductOnWarehouse 类似。我不能使用 id,还是必须事先获取 Product 和 Warehouse 实例?
where 条件不需要产品或仓库的实例,它需要一个具有给定实体的所有字段的对象,但它们都是可选的。例如,您可以这样做
this.storedProductsRepository.findOneBy({product:{id: "123"}});
它会找到产品 id 为“123”的所有
ProductOnWarehouse
实体(假设 storedProductsRepository
是 ProductOnWarehouse
实体的存储库)
要使用当前设置创建
ProductOnWarehouse
实体,您需要 Warehouse
和 Product
的实例。
如果您在实体中创建 productId
和 warehouseId
字段(字段名称基于您的 joinColumn
名称),您将能够仅从 ProductOnWarehouse
和 productId
创建 warehouseId
,而无需获取 的实例Product
或 Warehouse
通过从数据库获取它们或以不同的方式创建它们。
我想说这是更好的选择,特别是如果您关心应用程序的性能,因为它可以避免您对数据库进行不必要的查询。
我使用以下解决方案来加载关系:
var position = await this.products.findOne({
relations: {
product: true,
warehouse: true
},
where: {
product: {
id: data.productId
},
warehouse: {
id: warehouseId
}
}
})