Как получить связанные данные с моделями, созданными в форме Sequalize? - PullRequest
0 голосов
/ 27 марта 2019

Я разрабатывал серверное приложение NodeJ с поддержкой MySQL, используя Sequelize в качестве ORM.Я пытаюсь получить данные, вызвав API, который я создал.Он отправляет данные в ответ.Но это не касается связанного объекта, связанного с внешними ключевыми отношениями.

У меня уже была база данных MySQL, и я использовал sequelize ORM, я использовал sequelize-auto для генерации классов моделей.Все классы моделей были сгенерированы успешно.Но ассоциации не были созданы с моделями.Поэтому, чтобы удовлетворить ассоциации, мне пришлось вручную добавить ассоциации в модельный класс.Затем я создаю файлы маршрутов и создал метод HTTP GET.Но конечная точка API не отправляет данные, как ожидалось.

ниже показаны классы моделей и файлы маршрутов, которые я создал.

module.exports = function(sequelize, DataTypes) {
    const Department = sequelize.define('Department', {
        department_id: {
            type: DataTypes.INTEGER(11),
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: DataTypes.STRING(100),
            allowNull: false
        },
        description: {
            type: DataTypes.STRING(1000),
            allowNull: true
        }
    }, {
        tableName: 'department',
        timestamps: false,
        underscored: true
    });
    Department.associate = function(models) {
        // associations can be defined here
        Department.hasMany(models.Category, {
            foreignKey: 'department_id',
            as: 'categories',
        });
    };
    return Department;
};
module.exports = function(sequelize, DataTypes) {
    const Category = sequelize.define('Category', {
        category_id: {
            type: DataTypes.INTEGER(11),
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        department_id: {
            type: DataTypes.INTEGER(11),
            allowNull: false
        },
        name: {
            type: DataTypes.STRING(100),
            allowNull: false
        },
        description: {
            type: DataTypes.STRING(1000),
            allowNull: true
        }
    }, {
        tableName: 'category',
        timestamps: false,
        underscored: true
    });
    Category.associate = function(models) {
        // associations can be defined here
        Category.belongsTo(models.Department)
    };
    return Category;
};
var express = require('express');
var router = express.Router();
var model = require('../models/index');

/* GET departments listing. */
router.get('/', function(req, res, next) {
    model.Department.findAll({})
        .then(department => res.json({
            error: false,
            data: department
        }))
        .catch(error => res.json({
            data: [],
            error: true
        }));
});
module.exports = router;
var express = require('express');
var router = express.Router();
var model = require('../models/index');

/* GET category listing. */
router.get('/', function(req, res, next) {
    model.Category.findAll({})
        .then(category => res.json({
            error: false,
            data: category
        }))
        .catch(error => res.json({
            data: [],
            error: true
        }));
});
module.exports = router;

Ответ для / отдела маршрута

{
    "error": false,
    "data": [
        {
            "department_id": 1,
            "name": "Regional",
            "description": "Proud of your country? Wear a T-shirt with a national symbol stamp!"
        },
        {
            "department_id": 2,
            "name": "Nature",
            "description": "Find beautiful T-shirts with animals and flowers in our Nature department!"
        },
        {
            "department_id": 3,
            "name": "Seasonal",
            "description": "Each time of the year has a special flavor. Our seasonal T-shirts express traditional symbols using unique postal stamp pictures."
        }
    ]
}

Ответ для / категория маршрута

{
    "data": [],
    "error": true
}

Я ожидал, что данные будут также связаны со связанными объектами.Но он не отправляет данные, как ожидалось.Что я тут не так сделал. enter image description here

1 Ответ

1 голос
/ 27 марта 2019

Дело в том, что вы не говорите в запросе, что вам нужны ассоциированные данные.Для этого вы должны использовать include внутри функции findAll().

/* GET departments listing. */
router.get('/', function(req, res, next) {
  model.Department.findAll({
    include: [{
      model: model.Category
      as: 'categories'
    }]
  })
    .then(department => res.json({
      error: false,
      data: department
    }))
    .catch(error => res.json({
      data: [],
      error: true
    }));
});

Редактировать:

Я видел, что вы изменили первичный ключ по умолчанию для моделей, так что вы такжедолжен указать это на Ассоциации категории.Sequelize по умолчанию работает только с односторонней связью, в вашем случае от Deparment до Category.Sequelize не знает о Deparment foreignkey на Category, даже когда вы его определили.Вы должны определить, на какой ключ вы указываете.

Category.associate = function(models) {
  // associations can be defined here
  Category.belongsTo(models.Department,  {as: 'department', foreignKey: 'department_id'})
};
...