使用belongstomany生成的表不与任何表节点js-sequesize关联

myzjeezk  于 2022-10-22  发布在  Mysql
关注(0)|答案(1)|浏览(124)

我有三张table公司,订阅和公司订阅。根据名称定义,公司可以购买/拥有计划,或者一个订阅属于多个公司。
因此,在模型/模式中,我定义如下:companies.js

const sequelize = require("../utils/database");
const bcrypt = require("bcrypt");
const { DataTypes, Model } = require("sequelize");
const subscription = require("./subscriptions");
const CompanySubscription = require("./companySubscription");

class companies extends Model {}

companies.init(
  {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      primaryKey: true,
      allowNull: false,
    },
    name: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    email: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    contactNo: {
      type: DataTypes.STRING,
      allowNull: true,
    },
    companySize: {
      type: DataTypes.INTEGER,
      allowNull: true,
    },
  },
  { sequelize, modelName: "companies" }
);

subscription.belongsToMany(companies, { through: CompanySubscription });

module.exports = companies;

subscription.js

const sequelize = require("../utils/database");

const { DataTypes, Model } = require("sequelize");

class subscription extends Model {}

subscription.init(
  {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true,
      allowNull: false,
    },
    subscriptionPlanType: {
      type: DataTypes.ENUM,
      values: ["Yearly", "Monthly"],
      allowNull: false,
    },
    name: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    memberCount: {
      type: DataTypes.INTEGER,
      allowNull: false,
    },
    amount: {
      type: DataTypes.FLOAT,
      allowNull: false,
    },
  },
  { sequelize, modelName: "subscription" }
);

module.exports = subscription;

公司订阅.js

const sequelize = require("../utils/database");
const companies = require("./companies");
const subscription = require("./subscriptions");
const { DataTypes, Model } = require("sequelize");

class CompanySubscription extends Model {}

CompanySubscription.init(
  {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true,
      allowNull: false,
    },
    status: {
      type: DataTypes.ENUM,
      values: ["active", "inactive"],
    },
    subscriptionType: {
      type: DataTypes.ENUM,
      values: ["Yearly", "Monthly"],
    },
    subscriptionPlanStartDate: {
      type: DataTypes.DATE,
    },
    subscriptionPlanEndDate: {
      type: DataTypes.DATE,
    },
    paidStatus: {
      type: DataTypes.ENUM,
      values: ["paid", "unpaid"],
    },
    paidDate: {
      type: DataTypes.DATE,
    },
  },
  { sequelize, modelName: "CompanySubscription" }
);

module.exports = CompanySubscription;

在控制器文件中,我能够设法插入数据。下面是代码:

const addBIlling = async (req, res) => {
  const foundSubcscription = await subscription.create({
    subscriptionPlanType: "Monthly",
    name: "s1",
    memberCount: 15,
    amount: 50.55,
  });

  const foundCompany = await companies.create({
    name: "company1",
    email: "company1@gmail.com",
    contactNo: "87964644",
    companySize: 20,
  });

  const insertedData = await foundSubcscription.addCompany(foundCompany, {
    through: {
      status: "active",
      paidStatus: "paid",
      subscriptionType: "Monthly",
      subscriptionPlanEndDate: moment().add(1, "months"),
      paidDate: moment().add(1, "months"),
    },
  });

  console.log("inserted data ", insertedData);
  res.json({ data: insertedData });
};

现在我想从数据库中获取记录,作为哪个公司购买了哪个订阅计划!i、 e.公司名称、认购计划及其有效和已支付状态和计划到期日期。
我尝试了以下代码:

const billingList = async (req, res) => {
  const billingData = await CompanySubscription.findAll({
    include: [{ model: companies }],
  });

  console.log("billing data ", billingData);
};

上面的代码抛出错误“companies is not associated to CompanySubscription!”。
我不知道我在哪里犯了错误?请帮帮我!

cgvd09ve

cgvd09ve1#

不要尝试将模型直接导入到彼此的模块中。在每个模型模块中定义模型注册函数,并将它们全部用于在一个位置/模块中注册模型,对于关联,您可以在每个注册函数中定义associate函数,并在all模型已注册后调用它们。这样就不会有循环依赖关系,所有关联都是正确的。
查看我的答案,了解如何做。

相关问题