如何在sequelize挂钩内运行另一个模型查询?

时间:2020-10-25 06:21:20

标签: node.js express sequelize.js

以下是我在sequelize中定义的PurchaseOrder模型。每当有PurchaseOrder更新时,我都想更新供应商模型。我想到了使用钩子来实现这一点。但是我无法访问该模型中的另一个模型。我尝试导入所有东西,但没有运气。这是使用钩子的正确方法,还是我应该使用什么来实现相同的目的?任何帮助或指示将不胜感激!

module.exports = (sequelize, Sequelize) => {
  const PurchaseOrder = sequelize.define("purchaseOrder", {
    totalAmount: {
      type: Sequelize.INTEGER
    },
    paid: {
      type: Sequelize.BOOLEAN
    },
    paymentMode: {
      type: Sequelize.ENUM('CASH', 'CHEQUE', 'BANK', 'CARD', 'NA')
    }
  }, {
    freezeTableName: true,
    hooks: {
      beforeUpdate: (order, options) => {
        // here I want to update the another model(Supplier).
        // But I couldn't able to access another model inside the hook
        Supplier.increment('balance'{
           where: { id: order.supplierId }
        });
      }
    }
  });

  return PurchaseOrder;
};

2 个答案:

答案 0 :(得分:2)

在我的代码中,我有几个挂钩可以更新其他模型(例如,审计更改记录)。您需要确保传递options.transaction,以便在链中稍后出现错误时回滚所有更改。

此示例访问由other_model键控的另一个表。当挂钩运行时,所有模型都应该已经在Sequelize中注册。

module.exports = function Order(sequelize, DataTypes) {
  const Order = sequelize.define(
      'order',
      { /* columns */ },
      {
        hooks: {
          beforeUpdate: async function(order, options) {
            // get the transaction, if it is set
            const { transaction } = options;

            // use sequelize.models and make sure to pass the 
            // transaction so it is rolled back if there is an error
            await sequelize.models.supplier.increment(balance, {
              where: { id: order.supplierId },
              transaction,
            });
          },
        },
      },
  });

  return Order;
}

答案 1 :(得分:1)

您可以尝试sequelize['Supplier'],因为所有模型都应已在Sequelize实例中注册。

尽管如此,我认为在此类挂钩中通过其他模型在数据库中进行修改不是一个好主意,因为在这种情况下,您应考虑到所有操作应在同一事务中完成,即应作为原子操作执行以避免某些修改失败时数据库中数据的状态不一致。