Можно ли получить идентификатор вставленной строки с помощью хуков в sequelize? - PullRequest
0 голосов
/ 10 января 2020

Я хочу создать уникальный номер заказа для каждого заказа. Я пытаюсь вложить идентификатор созданного заказа в номер заказа.
Существуют крючки в дальнейшем, описанные в документах .
Можно ли использовать какие-либо из этих крючков? Я использую beforeCreate() и beforeUpdate() для га sh пароль перед сохранением.

'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;
};

Обновление
Я пробовал ниже метод, но он не работает. Крюк работает, но строка не обновляется.

    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;
};

1 Ответ

0 голосов
/ 10 января 2020

Я попробовал метод ниже и обнаружил много вещей, которые можно сделать внутри определения модели.

'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;
};

Итак, когда пользователь создает заказ. Я использую транзакцию, чтобы вставить данные в две таблицы. Вот почему я могу получить доступ к order.OrderItem.product_id внутри хука.
Но если вы хотите получить доступ к любой другой модели, вы всегда можете использовать sequelize.models.YourModel
Я использую async и await потому что я тоже хочу order_number в ответе. Я достигаю этого, передавая транзакцию в ловушку.
Если кто-нибудь найдет лучший подход, предложите.

...