hello im tryng to use include on a query on sequelize but it returns that the two tables are not related
您好,IM尝试在Sequelize上的查询中使用INCLUDE,但它返回的是这两个表不相关
model atestado
it contains atestado data and two FKs one from medicoModel and another one from pacienteModel
Model atestado它包含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;
};
model medico
模范医学生
'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;
};
index
指标
'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;
and the Controller
和控制器
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();
I tried to use include on a query on atestadomodel including medicomodel but i got this error:
我试图在包括medicomodel在内的testadomodel上的查询中使用include,但我得到了这个错误:
EagerLoadingError [SequelizeEagerLoadingError]: Medico is not associated to Atestado!
at Atestado._getIncludedAssociation (/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:565:13)
at Atestado._validateIncludedElement (/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:502:53)
at /home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:421:37
at Array.map ()
at Atestado._validateIncludedElements (/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:417:39)
at Atestado.findAll (/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:1124:12)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async show (/home/ficdev/GestaoAtestado/src/app/controllers/atestadoControllerGestor.js:32:30)
EagerLoadingError[SequelizeEagerLoadingError]:MEDIO与Aestado无关!Aestado._getIncludedAssociation(/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:565:13)at Aestado._valiateIncludedElement(/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:502:53)at/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:421:37 at Array.map()at Aestado._validate IncludedElements(/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:417:39)at Aestado.findAll进程中的(/home/ficdev/GestaoAtestado/node_modules/sequelize/lib/model.js:1124:12)。进程中的TicksAnd拒绝(节点:内部/进程/任务_队列:95:5)在异步显示(/home/ficdev/GestaoAtestado/src/app/controllers/atestadoControllerGestor.js:32:30)中
更多回答
I would make sure that those hasMany()
calls are actually happening, also I've always set up "hasMany" in one direction and "hasOne" in the other just to make sure.
我会确保那些hasMany()调用确实在发生,而且我总是在一个方向上设置“hasMany”,在另一个方向上设置“hasone”,只是为了确保。
Just use initialized models from index
and don't import them once again directly (because that way you register them once again without any associations):
只需使用索引中的初始化模型,而不会再次直接导入它们(因为这样您就可以在没有任何关联的情况下再次注册它们):
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]
});
...
更多回答
我是一名优秀的程序员,十分优秀!