Sujeet
Sujeet

Reputation: 3810

Is it possible to get the inserted row's ID using hooks in sequelize?

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

Answers (1)

Sujeet
Sujeet

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

Related Questions