我正在開發一個銷售電影票的小型電子商務。我正在使用Sequelize來設計所有的模型及其關聯。我所面臨的問題與為創建最終訂單而定義的路線有關:
Order.create({
userId: req.body.userId, // Number
sessionId: req.body.sessionId, // Number
seats: req.body.seat, // Array of 物件
offsiteProducts: req.body.offsiteProducts // Array of objects
},
{
包括。[
{
模型。Seat,
屬性。[' area', 'number', 'roomId']
},
{
模型。異地產品。
屬性。['name', 'unitPrice']
}
]
}).then(order => {
res.json(order)。
})
模型之間的關系如下:
User.hasMany(Order) 。
Order. belongsTo(User)。
Session.hasMany(Order)。
Order. belongsTo(Session);
Seat.believToMany(Order, { through: "reserved_seats" });
Order. belongsToMany(Seat, { through: "reserved_seats" });
OffsiteProduct. belongsToMany(Order, { through: ReservedOffsiteProduct })。)
Order. belongsToMany(OffsiteProduct, { through: ReservedOffsiteProduct })。
對于 "一對多 "的關系,傳遞一個外鍵就足以讓 Sequelize 正確關聯模型。
但是對于"多對多 "的關聯(Sequelize中的" belongsToMany"),它將復制為座位和非現場產品輸入的資料,并將其分別作為訂單的一部分和新的獨立座位和非現場產品創建。
我如何才能避免這種行為,并僅在最終訂單中包含座位和非現場產品的陣列?謝謝。
uj5u.com熱心網友回復:
一種方法是在一個事務中執行一切。 這樣,它將是原子性的,即 "全部或沒有"。
Sequelize為多對多關聯提供了一些方法。 在這種情況下,可以為每個結點表進行單獨的呼叫。
考慮到這一點,可以為每個結點表進行單獨呼叫。
考慮到這一點,下面的方法應該可以在沒有任何重復的情況下完成插入:
let t = await sequelize.transaction()
try {
讓 order = await Order.create({
userId: req.body.userId,
sessionId: req.body.sessionId
}, {
transaction: t
})
let seats = await Seat.findAll({
where: {
id: {
[Op.in]: req.body.seatIds
}
}
})
讓offsiteProducts = await OffsiteProducts.findAll({
where: {
id: {
[Op.in]: req.body.offsiteProductIds
}
}
})
await order.addSeats( seats, { transaction: t })
await order.addOffsiteProducts(offsiteProducts, { transaction: t })
await t.commit()
} catch (err) {
如果(t) {
await t.rollback()
}
}
另外,如果OffsiteProducts和Seats表中的行的主鍵已經知道,上述內容可以簡化為:
let t = await sequelize.transaction()
try {
讓 order = await Order.create({
userId: req.body.userId,
sessionId: req.body.sessionId
}, {
transaction: t
})
await order.addSeats(req.body.seatIds, { transaction: t })
await order.addOffsiteProducts(req.body.offsiteProductIds, { transaction: t })
await t.commit()
} catch (err) {
如果(t) {
await t.rollback()
}
}
在檔案這里中,對于向.addSeats和.addOffsiteProducts方法傳遞主鍵陣列有更多解釋。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/320480.html
標籤:
