续集关联未正式化

问题描述 投票:0回答:1

你好,我尝试在sequelize的查询中使用include,但它返回两个表不相关

模型阿泰斯塔多 它包含 atestado 数据和两个 FK,一个来自 medicoModel,另一个来自 pacienteModel

'use strict';
const config = require('../config/config');
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize(process.env.DEV_DATABASE_URL, {
    dialect: 'postgres' // Adicione esta linha para especificar o dialeto
});
const medicoModel = require("./medicomodel")(sequelize, DataTypes);
const pacienteModel = require('./pacientemodel')(sequelize, DataTypes);

module.exports = (sequelize, DataTypes) => {
  const atestadoModel = sequelize.define('atestadoModel', {
    medicoFK: {
      type: DataTypes.STRING,
      references:{
      model: medicoModel,
      key: 'rg'
    }
    },
    pacienteFK: {
      type: DataTypes.STRING,
      references:{
      model: pacienteModel,
      key: 'rg'
    }
    },
    InativeAt: DataTypes.DATE
  }, {
    tableName: 'atestado',
    paranoid: true,
    deletedAt: 'InativeAt'
  });

  atestadoModel.associate = (models) => {
    atestadoModel.belongsTo(models.medicoModel, { foreignKey: 'medicoFK' });
    atestadoModel.belongsTo(models.pacienteModel, { foreignKey: 'pacienteFK' });
  };

  return atestadoModel;
};

医学模范

'use strict';

module.exports = (sequelize, DataTypes) => {
  const medicoModel = sequelize.define('medicoModel', {
    rg: DataTypes.STRING,
    InativeAt: DataTypes.DATE
  }, {
    tableName: 'medico',
    paranoid: true,
    deletedAt: 'InativeAt'
  });

  medicoModel.associate = (models) => {
    medicoModel.hasMany(models.atestadoModel, { foreignKey: 'medicoFK' });
  };

  return medicoModel;
};

索引

'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const process = require('process');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.js')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (
      file.indexOf('.') !== 0 &&
      file !== basename &&
      file.slice(-3) === '.js' &&
      file.indexOf('.test.js') === -1
    );
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

和控制器

const config = require('../database/config/config');
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize(process.env.DEV_DATABASE_URL, {
    dialect: 'postgres' // Adicione esta linha para especificar o dialeto
});
const medicoModel = require('../database/models/medicomodel')(sequelize, DataTypes);
const atestadoModel = require('../database/models/atestadomodel')(sequelize, DataTypes);
class AtestadoController {
    
    async show(req, res) {
        try {
            const atestado = await atestadoModel.findAll({
                include: [medicoModel]
            });
            res.status(200).json(atestado);
        } catch (error) {
            console.error(error);
            res.status(404).json({ error: 'Ocorreu um erro ao buscar os atestados.' });
        }
    }
    
}

module.exports = new AtestadoController();

我尝试在 atestadomodel 上的查询中使用 include,包括 medicomodel,但出现此错误:

EagerLoadingError [SequelizeEagerLoadingError]:Medico 与 Atestado 没有关联! 在 Atestado._getIncludedAssociation (/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:565:13) 在 Atestado._validateIncludedElement (/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:502:53) 在/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:421:37 在Array.map() 在 Atestado._validateIncludedElements (/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:417:39) 在 Atestado.findAll (/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:1124:12) 在 process.processTicksAndRejections (节点:内部/进程/task_queues:95:5) 在异步表演中(/home/ficdev/GestaoAtestado/src/app/controllers/atestadoControllerGestor.js:32:30)

javascript node.js postgresql express sequelize.js
1个回答
0
投票

只需使用

index
中的初始化模型,不要直接再次导入它们(因为这样你就可以在没有任何关联的情况下再次注册它们):

const config = require('../database/config/config');
const { Sequelize, DataTypes } = require('sequelize');
const { medicoModel, atestadoModel } = require('../database/models');

class AtestadoController {
    
    async show(req, res) {
        try {
            const atestado = await atestadoModel.findAll({
                include: [medicoModel]
            });
...
© www.soinside.com 2019 - 2024. All rights reserved.