Reputation: 11
I do not understand why my api is calling this column and not courseSection.courseId. from postman
I am building my project using AngularJs, PostgresSQL, NodeJs and Sequelize ORM.
This is my part of my course.contorller.js:
const db = require("../models");
const Course = db.course;
//view course catalogue
exports.retrieveAll = (req, res) => {
Course.findAll({
include: [{
model: db.courseSection,
as: "courseSection"
}, {
model: db.category,
as: "category"
}]
})
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message: err.message
});
}); };
This is my course.model.js
module.exports = (sequelize, Sequelize) => {
const Course = sequelize.define(
"course",
{
courseId: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true,
},
name: {
type: Sequelize.STRING,
allowNull: false,
validate: {
notEmpty: true,
},
},
description: {
type: Sequelize.STRING,
},
creditPrice: {
type: Sequelize.INTEGER,
},
isArchived: {
type: Sequelize.BOOLEAN,
defaultValue: false,
},
isDraft: {
type: Sequelize.BOOLEAN,
},
level: {
type: Sequelize.ENUM({
values: [
"PRIMARY 1",
"PRIMARY 2",
"PRIMARY 3",
"PRIMARY 4",
"PRIMARY 5",
"PRIMARY 6",
],
}),
},
createdAt: {
type: Sequelize.DATE,
},
updatedAt: {
type: Sequelize.DATE,
},
},
{
classMethods: {
associate: function (models) {
Course.hasMany(models.CourseSection, {
foreignKey: "courseId",
onDelete: "CASCADE",
});
Course.hasMany(models.Material, {
foreignKey: "courseId",
onDelete: "CASCADE",
});
Course.hasMany(models.Review, {
foreignKey: "courseId",
onDelete: "CASCADE",
});
Course.hasMany(models.Enrolment, {
foreignKey: "courseId",
onDelete: "CASCADE",
});
Course.belongsTo(models.Category, {
foreignKey: "categoryId",
onDelete: "CASCADE",
});
Course.belongsTo(models.User, {
foreignKey: "userId",
onDelete: "CASCADE",
});
},
},
}
);
return Course;
};
My courseSection.js
module.exports = (sequelize, Sequelize) => {
const CourseSection = sequelize.define(
"courseSection",
{
sectionId: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true,
},
name: {
type: Sequelize.STRING,
allowNull: false,
validate: {
notEmpty: true,
},
},
isArchived: {
type: Sequelize.BOOLEAN,
defaultValue: false,
},
createdAt: {
type: Sequelize.DATE,
},
updatedAt: {
type: Sequelize.DATE,
},
},
{
classMethods: {
associate: function (models) {
CourseSection.belongsTo(models.Course, {
foreignKey: "courseId",
onDelete: "CASCADE",
});
},
},
}
);
return CourseSection;
};
My migration for course.js
"use strict";
//npx sequelize migration:generate --name course
module.exports = {
up: async (queryInterface, Sequelize) => {
return queryInterface.createTable("course", {
courseId: {
allowNull: false,
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true,
},
categoryId: {
type: Sequelize.INTEGER,
onDelete: "CASCADE",
references: {
model: "category",
key: "categoryId",
},
},
userId: {
type: Sequelize.INTEGER,
onDelete: "CASCADE",
references: {
model: "user",
key: "userId",
},
},
name: {
type: Sequelize.STRING,
allowNull: false,
validate: {
notEmpty: true,
},
},
description: {
type: Sequelize.STRING,
},
creditPrice: {
type: Sequelize.INTEGER,
},
isArchived: {
type: Sequelize.BOOLEAN,
defaultValue: false,
},
isDraft: {
type: Sequelize.BOOLEAN,
},
level: {
type: Sequelize.ENUM({
values: [
"PRIMARY 1",
"PRIMARY 2",
"PRIMARY 3",
"PRIMARY 4",
"PRIMARY 5",
"PRIMARY 6",
],
}),
},
createdAt: {
type: Sequelize.DATE,
},
updatedAt: {
type: Sequelize.DATE,
},
});
},
down: async (queryInterface, Sequelize) => {
return queryInterface.dropTable("course");
},
};
My migration for courseSection
"use strict";
module.exports = {
up: async (queryInterface, Sequelize) => {
return queryInterface.createTable("courseSection", {
sectionId: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true,
},
name: {
type: Sequelize.STRING,
allowNull: false,
validate: {
notEmpty: true,
},
},
courseId: {
type: Sequelize.INTEGER,
onDelete: "CASCADE",
references: {
model: "course",
key: "courseId",
},
},
isArchived: {
type: Sequelize.BOOLEAN,
defaultValue: false,
},
createdAt: {
type: Sequelize.DATE,
},
updatedAt: {
type: Sequelize.DATE,
},
});
},
down: async (queryInterface, Sequelize) => {
return queryInterface.dropTable("courseSection");
},
};
My index.js in /model
my postgres table:
When I do localhost:3000/courses/course, my vscode shows the following error:
Executing (default): SELECT "course"."courseId", "course"."name", "course"."description", "course"."creditPrice", "course"."isArchived", "course"."isDraft", "course"."level", "course"."createdAt", "course"."updatedAt", "course"."categoryCategoryId", "course"."categoryId", "course"."userId", "course"."userUserId", "courseSection"."sectionId" AS "courseSection.sectionId", "courseSection"."name" AS "courseSection.name", "courseSection"."isArchived" AS "courseSection.isArchived", "courseSection"."createdAt" AS "courseSection.createdAt", "courseSection"."updatedAt" AS "courseSection.updatedAt", "courseSection"."courseCourseId" AS "courseSection.courseCourseId", "courseSection"."courseId" AS "courseSection.courseId", "category"."categoryId" AS "category.categoryId", "category"."isArchived" AS "category.isArchived", "category"."name" AS "category.name", "category"."createdAt" AS "category.createdAt", "category"."updatedAt" AS "category.updatedAt" FROM "course" AS "course" LEFT OUTER JOIN "courseSection" AS "courseSection" ON "course"."courseId" = "courseSection"."courseCourseId" LEFT OUTER JOIN "category" AS "category" ON "course"."categoryId" = "category"."categoryId";
I have been on this problem for the past 2 days and I honestly do not know where I went wrong. I hope anyone can help me please.
Upvotes: 0
Views: 1286
Reputation: 22803
You defined associations between courseSection
and course
twice:
associate
methods of a model classes (correct ones)index.js
without indicating foreignKey
optionI suppose you just need to remove associations in index.js
and just call associate
methods of models in index.js
.
Something like
db.category.associate(db.models);
// and so on
Upvotes: 0