Reputation: 3810
I want to generate unique order number for each order. I am trying to nest created order's id inside order number.
There are hooks in sequelize described in the docs .
Is it possible to do using any of these hooks?
I use beforeCreate()
and beforeUpdate()
to hash password before saving.
'use strict';
module.exports = (sequelize, DataTypes) => {
const Order = sequelize.define('Order', {
buyer_id: DataTypes.INTEGER.UNSIGNED,
order_status_code: DataTypes.TINYINT.UNSIGNED,
order_detail: DataTypes.TEXT,
order_date: DataTypes.DATE
}, {
hooks: {
beforeSave: function(order, options) {
order.order_number = order.order_id + "UNIQUE"
}
}
});
Order.associate = function(models) {
// associations can be defined here
Order.hasOne(models.OrderItem,{foreignKey: "order_id"})
};
return Order;
};
Update
I tried below method, but It's not working. Hook is running but row is not being updated.
module.exports = (sequelize, DataTypes) => {
const Order = sequelize.define('Order', {
buyer_id: DataTypes.INTEGER.UNSIGNED,
order_status_code: DataTypes.TINYINT.UNSIGNED,
order_detail: DataTypes.TEXT,
order_date: DataTypes.DATE
}, {
hooks:{
afterCreate: function(order, options) {
order.update({
order_number : 'OD' + Date.now + order.id + order.OrderItem.product_id + order.buyer_id
})
}
}
});
Order.associate = function(models) {
// associations can be defined here
Order.hasOne(models.OrderItem,{foreignKey: "order_id"})
};
return Order;
};
Upvotes: 1
Views: 916
Reputation: 3810
I tried below method and I discovered a lot of things that can be done inside a model definition.
'use strict';
module.exports = (sequelize, DataTypes) => {
const Order = sequelize.define('Order', {
buyer_id: DataTypes.INTEGER.UNSIGNED,
order_status_code: DataTypes.TINYINT.UNSIGNED,
order_detail: DataTypes.TEXT,
order_date: DataTypes.DATE,
order_number: DataTypes.STRING(20)
}, {
hooks:{
afterCreate: async function(order, options) {
await order.update(
{
order_number : 'OD' + Date.now() + order.id + order.OrderItem.product_id + order.buyer_id
},
{
transaction: options.transaction
})
}
}
});
Order.associate = function(models) {
// associations can be defined here
Order.hasOne(models.OrderItem,{foreignKey: "order_id"})
};
return Order;
};
So, When a user creates a order. I use transaction to insert the data in two tables. That's why I can access order.OrderItem.product_id
inside the hook.
But if you want to access any other model, you can always use sequelize.models.YourModel
I am using async
and await
because I also want the order_number
in the response. I achieve this by passing the transaction in the hook.
If anyone finds a better approach please suggest.
Upvotes: 2