mysql 使用belongstomany生成的表未与任何表关联

yv5phkfx  于 2022-11-21  发布在  Mysql
关注(0)|答案(1)|浏览(163)

我有三个表companies,subscriptions和companySubscription根据名称定义,公司可以购买/拥有计划,或者一个订阅属于多个公司
因此在模型/模式中我已经定义如下:
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;

companySubscription.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 });
};

现在,我想从数据库中获取记录,作为哪个公司购买了哪个订阅计划!即公司名称,订阅计划及其活动和已支付状态和计划的到期日期。
我试了下面的代码:

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

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

上述代码引发错误“公司未与CompanySubscription关联!"。
我哪里做错了?

qmb5sa22

qmb5sa221#

不要试图直接将模型导入到其他模块中。在每个模型模块中定义模型注册函数,并使用它们在一个位置/模块中注册模型。对于关联,您可以在每个注册函数中定义associate函数,并在所有模型都已注册后调用它们。这样,您就不会有循环依赖关系,所有关联都是正确的。
请参阅我的答案here,以了解如何做到这一点。

相关问题