1

I have two models create_project and create_stages, to run the queries I have called the model.associate in each model

create_project model

const { DataTypes } = require("sequelize");
const { getConnection } = require("../helper/databaseConnection");

const createProjectModel = {
  id: {
    type: new DataTypes.INTEGER(),
    autoIncrement: true,
    primaryKey: true,
  },
  project_name: {
    type: new DataTypes.STRING(),
    allowNull: true,
  },
  project_code: {
    type: new DataTypes.STRING(200),
    allowNull: true,
  },
  isActive: {
    type: new DataTypes.INTEGER(),
    defaultValue: 1,
  },
};

let project = null;
const initProjectModel = async () => {
  try {
    if (project) return project;
    const sequelize = await getConnection();
    project = sequelize.define("create_project", createProjectModel, {
      freezeTableName: true,
    });

    project.associate = (models) => {
      project.hasMany(models.stages, { foreignKey: "project_id" });
    };

    await project.sync({ alter: true });
    return project;
  } catch (err) {
    console.log(err.message);
  }
};

module.exports = { initProjectModel };

create_stage model

const { DataTypes } = require("sequelize");
const { getConnection } = require("../helper/databaseConnection");

const createStagesModel = {
  id: {
    type: new DataTypes.INTEGER(),
    autoIncrement: true,
    primaryKey: true,
  },
  stages_name: {
    type: new DataTypes.STRING(),
    allowNull: false,
  },
  stages_code: {
    type: new DataTypes.STRING(200),
    allowNull: false,
  },
  isActive: {
    type: new DataTypes.INTEGER(),
    defaultValue: 1,
  },
};

let stages = null;
const initStagesModel = async () => {
  try {
    if (stages) return stages;
    const sequelize = await getConnection();
    stages = sequelize.define("create_stages", createStagesModel, {
      freezeTableName: true,
    });

    stages.associate = (models) => {
      stages.belongsTo(models.project, { foreignKey: "project_id" });
    };
    await stages.sync({ alter: true });
    return stages;
  } catch (err) {
    console.log(err.message);
  }
};

module.exports = { initStagesModel };

code I have done to fetch the stages

const express = require("express");
const router = express.Router();

const { initStagesModel } = require("../models/stageModel");
const { initProjectModel } = require("../models/projectModel");

router.get("/:id", async (req, res) => {
  try {
    const stageData = await initStagesModel();
    const projectData = await initProjectModel();
    const id = req.params.id;


    data = await projectData.findAll({
      include: [
        {
          models: stageData,
        },
      ],
      where: { id: id },
    });

    return res.status(200).send(data);
  } catch (err) {
    return res.status(400).send(err.stack);
  }
});

module.exports = router;

the problem is - it says Element has to be either a Model, an Association or an object.

stack

Error: Include unexpected. Element has to be either a Model, an Association or an object.
at create_project._conformInclude (D:\one to many example\node_modules\sequelize\lib\model.js:323:11)
at D:\one to many example\node_modules\sequelize\lib\model.js:270:61
at Array.map (<anonymous>)
    at create_project._conformIncludes (D:\one to many example\node_modules\sequelize\lib\model.js:270:39)
    at create_project._baseMerge (D:\one to many example\node_modules\sequelize\lib\model.js:622:10)
    at create_project._defaultsOptions (D:\one to many example\node_modules\sequelize\lib\model.js:656:17)
    at create_project._injectScope (D:\one to many example\node_modules\sequelize\lib\model.js:2001:10)
    at create_project.findAll (D:\one to many example\node_modules\sequelize\lib\model.js:1105:10)
    at D:\one to many example\controllers\listStages.js:23:30
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
sumanth
  • 318
  • 1
  • 6
  • 25
  • 1
    In that Sequelize query, you have joined two tables, using the property include. that can contain an array of models. In that include property, each object should be like this {model: }, in your case you defined the property model in the plural, change it to singular, and check it – Bennison J Jan 03 '23 at 12:01

1 Answers1

1

First of all, you need to initialize your models and associations properly.

  1. You sync each model without completing the initialization of other models.
  2. You didn't call associate method of registered models and Sequelize knows nothing about associations between models and thus can't utilize include option in queries
  3. Because you call sync without having all associations registered you won't have any foreign keys in DB that should correspond the associations.

To get the better idea how to register models and associations please look at my answer here

P.S. Please check what init<ModelName> methods really return. It should be initialized Sequelize model object with methods such as create, update, findAll and so on.

Anatoly
  • 20,799
  • 3
  • 28
  • 42