Отношение Sequelize многие ко многим не показывает результат по запросу GET - PullRequest
1 голос
/ 30 марта 2020

Я новичок в реляционной базе данных. Я использую node js и express для бэкэнда, REST API и база данных Postgresql. Я использую Sequelize для подключения и моделей. Я создал две модели: одна студентка, а другая - курс. Моя цель - один студент может иметь несколько курсов, а также хочет предотвратить дублирование имени студента, телефона, электронной почты. Я успешно подключаюсь к базе данных и могу публиковать, получать, обновлять, удалять модели студентов и курсов. Из тестирования приложения я использую Почтальон. Но когда я пытаюсь получить запрос всех студентов или курсов. Я не вижу никакой связи между студентами и курсом. Вот визуализация студенты получают запрос и курсы получают запрос . ** Это живой код , если кто-нибудь захочет мне помочь **

const sequelize = require("sequelize");

var con = new sequelize("school", "postgres", "password", {
  host: "localhost",
  dialect: "postgres",

  pool: {
    max: 5,
    min: 0,
    idle: 10000
  }
});

const Student = con.define("student", {
  id: {
    type: sequelize.INTEGER,
    primaryKey: true
  },
  name: {
    type: sequelize.STRING,
    allowNull: false
  },
  birthday: {
    type: sequelize.DATEONLY,
    allowNull: false
  },
  address: {
    type: sequelize.STRING,
    allowNull: false
  },
  zipcode: {
    type: sequelize.INTEGER,
    allowNull: false
  },
  city: {
    type: sequelize.STRING,
    allowNull: false
  },
  phone: {
    type: sequelize.BIGINT,
    allowNull: false
  },

  email: {
    type: sequelize.STRING,
    allowNull: false,
    validate: {
      isEmail: true
    }
  }
});

const Course = con.define("course", {
  id: {
    type: sequelize.INTEGER,
    primaryKey: true
  },
  name: { type: sequelize.STRING },
  startdate: { type: sequelize.DATEONLY },
  enddate: { type: sequelize.DATEONLY },
  studentId: { type: sequelize.INTEGER, foreignKey: true }
});

const StudentCourse = con.define("studentCourses", {
  id: {
    type: sequelize.INTEGER,
    primaryKey: true
  },
  courseId: { type: sequelize.INTEGER, foreignKey: true },
  studentId: { type: sequelize.INTEGER, foreignKey: true }
});

Student.belongsToMany(Course, { through: StudentCourse, as: "courses" });
Course.belongsToMany(Student, { through: StudentCourse, as: "students" });

//con.sync({ force: true });

module.exports = { Student, Course, StudentCourse };

Это мой REST API с использованием Node и сервера Express. Как я могу отобразить реляционный браузер.

      require("dotenv").config();
const express = require("express");
const app = express();
const morgan = require("morgan");
const helmet = require("helmet");
const cors = require("cors");

const { Student, Course, StudentCourse } = require("./db");
//app middlewear

app.use(morgan("common"));
app.use(helmet());
app.use(cors());
app.use(express.json()); //body Parser

//student

app.get("/students", async (req, res, next) => {
  try {
    await Student.findAll({
      include: {
        model: Course,
        through: StudentCourse,
        as: "courses"
      }
    }).then(docs => {
      const response = {
        count: docs.length,
        students: docs
      };
      res.json(response);
    });
  } catch (error) {
    console.log(error);
  }
});

app.get("/students/:id", async (req, res, next) => {
  const id = req.params.id;
  try {
    Student.findByPk(id).then(data => {
      console.log(data);
      res.json(data);
    });
  } catch (error) {
    console.log(error);
  }
});

app.put("/students/:id", async (req, res) => {
  const id = req.params.id;
  const update = req.body;
  try {
    await Student.update(update, { where: { id } }).then(data => {
      res.json(data);
    });
  } catch (error) {
    console.log(error);
  }
});

app.delete("/students/:id", async (req, res, next) => {
  const id = req.params.id;

  try {
    Student.destroy({ where: { id } }).then(data => {
      res.json(data);
    });
  } catch (error) {
    console.log(error);
  }
});

app.post("/students", async (req, res, next) => {
  try {
    const logs = new Student(req.body);
    const entry = await logs.save();
    res.json(entry);
  } catch (error) {
    if (error.name === "ValidationError") {
      res.status(422);
    }
    next(error);
  }
});

//course

app.get("/courses", async (req, res, next) => {
  try {
    await Course.findAll({
      include: {
        model: Student,
        through: StudentCourse,
        as: "students"
      }
    }).then(docs => {
      const response = {
        count: docs.length,
        courses: docs
      };
      res.json(response);
    });
  } catch (error) {
    console.log(error);
  }
});

app.get("/courses/:id", async (req, res, next) => {
  const id = req.params.id;
  try {
    Course.findByPk(id).then(data => {
      console.log(data);
      res.json(data);
    });
  } catch (error) {
    console.log(error);
  }
});

app.put("/courses/:id", async (req, res, next) => {
  const id = req.params.id;
  const update = req.body;
  try {
    await Course.update(update, { where: { id } }).then(data => {
      res.json(data);
    });
  } catch (error) {
    console.log(error);
  }
});

app.delete("/courses/:id", async (req, res, next) => {
  const id = req.params.id;

  try {
    Course.destroy({ where: { id } }).then(data => {
      res.json(data);
    });
  } catch (error) {
    console.log(error);
  }
});

app.post("/courses", async (req, res, next) => {
  try {
    const logs = new Course(req.body);
    const entry = await logs.save();
    res.json(entry);
  } catch (error) {
    if (error.name === "ValidationError") {
      res.status(422);
    }
    next(error);
  }
});

const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`? App is listening at port ${port}!`));

1 Ответ

0 голосов
/ 30 марта 2020

Для отношения many-to-many необходимо определить таблицу сопоставления.

const StudentCourse = con.define("studentCourses", {
  id: {
    type: sequelize.INTEGER,
    primaryKey: true
  },
  courseId: { type: sequelize.INTEGER, foreignKey: true },
  studentId: { type: sequelize.INTEGER, foreignKey: true }
});

Теперь определите свои ассоциации, как показано ниже.

Student.belongsToMany(Course, { through: StudentCourse, as: 'courses'});
Course.belongsToMany(Student, { through: StudentCourse, as: 'students' });

Здесь как бы вы запросили students с их курсами.

const studentWithCourses = await Student.findAll({
     include: {
            model: Course,
            through: StudentCourse,
            as: 'courses'
       }    
 })

Для получения дополнительной информации об ассоциации many-to-many, посмотрите здесь

...