Sequelize 模型关系在 NodeJS 中不起作用

问题描述 投票:0回答:1

您好,我是 Sequelize ORM 库的新手。我正在尝试将一些模型相互关联。当我添加与模型的关系时,它会给出以下错误。

throw new Error(`${source.name}.${_.lowerFirst(Type.name)} called with something that's not a subclass of Sequelize.Model`);

以下是我的模型定义。请注意,每个模型都在每个文件中。

const { DataTypes, Model } = require("sequelize");
const { Postgres } = require("../../config/postgres");
const { Department } = require("./department.model");

class Business extends Model {}

Business.init(
   {
      name: {
         type: DataTypes.STRING,
         allowNull: false,
      },
      type: {
         type: DataTypes.STRING,
         allowNull: false,
      },
      industry: {
         type: DataTypes.ENUM([
            "Finance",
            "Healthcare",
            "Retail",
            "Education",
            "Pharmaceutical",
            "Agriculture",
            "Other",
         ]),
         allowNull: false,
      },
      description: {
         type: DataTypes.TEXT,
         allowNull: true,
      },
   },
   {
      sequelize: Postgres,
      modelName: "Business",
      tableName: "businesses",
   },
);

Business.hasMany(Department, {
   foreignKey: "businessId",
   as: "departments",
});

module.exports = { Business };
const { DataTypes, Model } = require("sequelize");
const { Postgres } = require("../../config/postgres");
const { Order } = require("./order.model");
const { Business } = require("./business.model");

class Department extends Model {}

Department.init(
   {
      name: {
         type: DataTypes.STRING,
         allowNull: false,
      },
      description: {
         type: DataTypes.TEXT,
         allowNull: true,
      },
      businessId: {
         type: DataTypes.INTEGER,
         allowNull: false,
         references: {
            model: Business,
            key: "id",
         },
      },
   },
   {
      sequelize: Postgres,
      modelName: "Department",
      tableName: "departments",
   },
);

Department.belongsTo(Business, {
   foreignKey: "businessId",
   as: "business",
});

Department.hasMany(Order, {
   foreignKey: "departmentId",
   as: "orders",
});

module.exports = { Department };

const { DataTypes, Model } = require("sequelize");
const { Postgres } = require("../../config/postgres");
const { Department } = require("./department.model");

class Order extends Model {}

Order.init(
   {
      productName: {
         type: DataTypes.STRING,
         allowNull: false,
      },
      quantity: {
         type: DataTypes.INTEGER,
         allowNull: false,
      },
      amount: {
         type: DataTypes.DECIMAL(10, 2),
         allowNull: false,
      },
      status: {
         type: DataTypes.ENUM(["SUCCESS", "PENDING", "FAILED"]),
         defaultValue: "PENDING",
         allowNull: false,
      },
      orderReference: {
         type: DataTypes.STRING,
         allowNull: false,
         unique: true,
      },
      departmentId: {
         type: DataTypes.INTEGER,
         references: {
            model: Department,
            key: "id",
         },
         allowNull: false,
      },
   },
   {
      sequelize: Postgres,
      modelName: "Order",
      tableName: "orders",
   },
);

Order.belongsTo(Department, {
   foreignKey: "departmentId",
   as: "department",
});

module.exports = { Order };

下面是一个尝试查看特定业务订单的函数。

const getOrderDetails = async (request, response) => {
   const businessId = request.user.id;
   const business = await Business.findByPk(businessId, {
      include: [
         {
            model: Department,
            as: "departments",
            include: [
               {
                  model: Order,
                  as: "orders",
               },
            ],
         },
      ],
   });
   if (!business) {
      console.log("Business not found");
      return;
   }
   console.log(business);
}

我尝试过关联模型但无法关联。我还尝试在模型类中定义静态关联方法,如下所示:

static associate(models) {
   this.belongsTo(models.Business)
}


Department.associate({ Business })
node.js postgresql orm sequelize.js
1个回答
0
投票

您应该在一个单独的模块(例如 db init 模块或类似模块)中调用关联方法,您可以在其中导入所有模型并按照您需要的方式关联它们,或者在每个模型中定义一个静态

associate
方法并在此调用它们分离模块并消除彼此模块中模型的交叉引用:

db.js

const { Department } = require("./department.model");
const { Order } = require("./order.model");
const { Business } = require("./business.model");

Business.hasMany(Department, {
   foreignKey: "businessId",
   as: "departments",
});

Department.belongsTo(Business, {
   foreignKey: "businessId",
   as: "business",
});
Department.hasMany(Order, {
   foreignKey: "departmentId",
   as: "orders",
});

Order.belongsTo(Department, {
   foreignKey: "departmentId",
   as: "department",
});
© www.soinside.com 2019 - 2024. All rights reserved.