链接实体是否会限制搜索和创建新对象的能力?

问题描述 投票:0回答:2

我使用 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 实例?

postgresql nestjs typeorm
2个回答
0
投票

where 条件不需要产品或仓库的实例,它需要一个具有给定实体的所有字段的对象,但它们都是可选的。例如,您可以这样做

this.storedProductsRepository.findOneBy({product:{id: "123"}});

它会找到产品 id 为“123”的所有

ProductOnWarehouse
实体(假设
storedProductsRepository
ProductOnWarehouse
实体的存储库)

要使用当前设置创建

ProductOnWarehouse
实体,您需要
Warehouse
Product
的实例。 如果您在实体中创建
productId
warehouseId
字段(字段名称基于您的
joinColumn
名称),您将能够仅从
ProductOnWarehouse
productId
创建
warehouseId
,而无需获取 的实例
Product
Warehouse
通过从数据库获取它们或以不同的方式创建它们。

我想说这是更好的选择,特别是如果您关心应用程序的性能,因为它可以避免您对数据库进行不必要的查询。


0
投票

我使用以下解决方案来加载关系:

var position = await this.products.findOne({
        relations: {
            product: true,
            warehouse: true
        },
        where: {
            product: {
                id: data.productId
            },
            warehouse: {
                id: warehouseId
            }
        }
    })
© www.soinside.com 2019 - 2024. All rights reserved.