我正在开发一个express(使用TypeORM)+ ReactJS应用程序。
问题是我有 3 个通过 OneToMany 关系链接的实体,如下所示:
- customer
- 产品(链接到客户)
- 型号(与产品相关)
import { Product } from './product.entity'
@Entity('customer')
export class Customer extends BaseEntity{
@PrimaryGeneratedColumn()
readonly id: number;
@Column ({name: 'name'})
name : string;
@Column ({name: 'test', nullable: true})
test : string;
@OneToMany(() => Product, product => product.customer)
// @JoinColumn({ name: 'product_id' })
products: Product[]
}
import {Customer} from './customer.entity'
import {Model} from './model.entity'
@Entity('product')
export class Product extends BaseEntity{
@PrimaryGeneratedColumn()
readonly id: number;
@Column ({name: 'name'})
name : string;
@Column ({name: 'test', nullable: true})
test : string;
@Column ({name: 'deleted', nullable: true})
deleted : string;
@ManyToOne(() => Customer, customer => customer.products)
@JoinColumn({ name: 'customer_id' })
customer: Customer;
@OneToMany(() => Model, model => model.product)
@JoinColumn({ name: 'customer_id' })
models: Model[]
}
import { Product } from "./product.entity";
@Entity('model')
export class Model extends BaseEntity{
@PrimaryGeneratedColumn()
readonly id: number;
@Column ({name: 'name'})
name : string;
@Column ({name: 'size', nullable: true})
size : string;
@Column ({name: 'deleted', nullable: true})
deleted : string;
@ManyToOne(() => Product, product => product.models)
@JoinColumn({ name: 'product_id' })
product: Product;
}
Express的保存方法是:
static add = async(req: Request, res)=> {
const connection = getConnection();
const queryRunner = connection.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
let customer: Customer
customer = await queryRunner.manager.getRepository(Customer).findOneOrFail(req.body.id)
const productsReq: Array<Product> = req.body.products
productsReq.forEach(async (product: any) => {
let updatedProd = {...product, customer: customer}
const savedProd = await queryRunner.manager.getRepository(Product).save({...updatedProd})
product.models.forEach(async (model: any) => {
let updatedModel = {...model, product: savedProd}
await queryRunner.manager.getRepository(Model).save(updatedModel)
});
});
await queryRunner.commitTransaction();
return res.send('Saving done')
} catch (error) {
console.log(error)
await queryRunner.rollbackTransaction();
res.status(500).send('Some error occurs');
} finally {
}
}
目前,在数据库中,我有以下数据:
1 位 ID 为 30 的客户
name |
id |
test |
first customer |
30 |
test column |
1 个 ID 为 119 的产品关联到客户 30
id |
name |
test |
customer_id |
deleted |
119 |
first product |
test column |
30 |
|
2 个型号,其 ID:90 和 91 链接到产品 119
id |
name |
size |
deleted |
product_id |
91 |
second model witout id |
2000 |
|
119 |
90 |
first model with id |
1000 |
|
119 |
接下来,在 React 中,我尝试仅更新 id 为 90 的模型并添加一个新模型。
(所以我不会发送到后端所有模型,id 为 91 的模型不会发送)。
从前端发送到后端的 JSON 对象如下所示:
{
"id": 30,
"name": "first customer",
"test": "test column",
"products": [
{
"id" : 119,
"name": "first product",
"test": "test column",
"models": [
{
"id": 90,
"name": "first model with id",
"size": 1000
},
{
"name": "second model witout id",
"size": 2000
}
]
}
]
}
但问题是在数据库中,对于 id 为 91 的模型,表“model”上的外键“product_id”设置为 null,并插入了新行(92)。
结果是:
|id|name|size|deleted|product_id|
|--|----|----|-------|----------|
|91|second model witout id|2000|||
|90|first model with id|1000||119|
|92|second model witout id|2000||119|
如何添加新模型并更新现有模型而不发送数据库中的所有现有模型?